Outdoorsy Conversations API
The conversations API from Outdoorsy — 4 operation(s) for conversations.
The conversations API from Outdoorsy — 4 operation(s) for conversations.
openapi: 3.2.0
info:
description: 'The Outdoorsy API (or simply "API") is organized around REST. It uses
predictable, resource-oriented URLs and implements standard HTTP response
codes, verbs, authentication mechanisms, and a variety of request encodings.
## Versioning
The API implements semantic versioning.'
title: Outdoorsy API Documentation Conversations API
version: 0.0.1
servers:
- url: /v0
security:
- Bearer:
- '[]'
- API-Key:
- '[]'
tags:
- name: conversations
paths:
/admin/ai-reply-suggestions:
get:
description: 'Returns a paginated list of AI-generated reply suggestions for the specified conversation.
Suggestions are ordered by creation date in descending order (newest first).
Requires conversation_id query parameter. Supports pagination via offset and limit.
Filter by confidence level with threshold_min and threshold_max (inclusive); if omitted,
threshold_min defaults to 0 and threshold_max defaults to 1.
Admin access required.'
tags:
- conversations
summary: List AI reply suggestions for a conversation.
operationId: listAiReplySuggestions
parameters:
- name: Offset
in: query
schema:
type: integer
format: int64
- name: Limit
in: query
schema:
type: integer
format: int64
- name: ThresholdMin
in: query
schema:
type: number
format: double
- name: ThresholdMax
in: query
schema:
type: number
format: double
- x-go-name: ConversationID
name: conversation_id
in: query
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/aiReplySuggestionsResponse'
'400':
$ref: '#/components/responses/badRequestError'
'401':
$ref: '#/components/responses/unauthorizedError'
default:
$ref: '#/components/responses/genericError'
/conversations:
get:
description: Lists conversations
tags:
- conversations
operationId: listConversations
parameters:
- x-go-name: UserID
name: user_id
in: query
schema:
type: integer
format: int64
- x-go-name: LocationIDs
name: location_ids
in: query
schema:
type: string
- x-go-name: Single
name: single
in: query
schema:
type: boolean
- x-go-name: Statuses
name: booking_status
in: query
schema:
type: string
- x-go-name: Archived
name: archived
in: query
schema:
type: boolean
- x-go-name: RenterID
name: renter_id
in: query
schema:
type: integer
format: int64
- x-go-name: HasMessages
name: has_messages
in: query
schema:
type: boolean
- x-go-name: Order
name: order
in: query
schema:
type: string
- x-go-name: Offset
name: offset
in: query
schema:
type: integer
format: int64
- x-go-name: Limit
name: limit
in: query
schema:
type: integer
format: int64
- x-go-name: OnlyNew
name: new
in: query
schema:
type: boolean
- x-go-name: ExcludeBookings
name: exclude_bookings
in: query
schema:
type: boolean
responses:
'200':
$ref: '#/components/responses/listConversationResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
default:
$ref: '#/components/responses/genericError'
post:
description: Creates a new conversation between two users
tags:
- conversations
operationId: createConversation
responses:
'200':
$ref: '#/components/responses/conversationResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
default:
$ref: '#/components/responses/genericError'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ConversationBody'
/conversations/{id}:
get:
description: Get conversation by id
tags:
- conversations
operationId: getConversationById
parameters:
- x-go-name: Offset
name: offset
in: query
schema:
type: integer
format: int64
- x-go-name: Limit
name: limit
in: query
schema:
type: integer
format: int64
- x-go-name: OrderBy
name: order_by
in: query
schema:
type: string
- x-go-name: Active
description: 'false -> bookings: MinBooking, true -> bookings: Booking'
name: active
in: query
schema:
type: boolean
- x-go-name: WithoutBookings
description: when true, bookings array will be empty
name: without_bookings
in: query
schema:
type: boolean
- x-go-name: MinBookings
description: when true, bookings array will only contain the most relevant booking
name: min_bookings
in: query
schema:
type: boolean
- x-go-name: IncludeSystem
description: when true, system messages will be included in the messages array
name: include_system
in: query
schema:
type: boolean
- x-go-name: IncludeCurrent
description: when true, bookings array will contain bookings with status negotiating, approved, imminent, handed_off
name: include_current
in: query
schema:
type: boolean
- x-go-name: ID
name: id
in: path
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/conversationResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
default:
$ref: '#/components/responses/genericError'
put:
description: Update conversation by id
tags:
- conversations
operationId: updateConversation
responses:
'200':
$ref: '#/components/responses/conversationResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
default:
$ref: '#/components/responses/genericError'
delete:
description: Archive a conversation
tags:
- conversations
operationId: archiveConversation
parameters:
- x-go-name: ID
name: id
in: path
required: true
schema:
type: integer
format: int64
responses:
'204':
$ref: '#/components/responses/noContentResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
/conversations/{id}/ai-reply-suggestion:
get:
description: 'This endpoint returns an AI-generated reply suggestion based on the conversation history.
The suggestion is cached, so subsequent requests for the same message will return the cached suggestion.
Only conversation owners can access this endpoint.'
tags:
- conversations
summary: Get AI-generated reply suggestion for a conversation.
operationId: getReplySuggestion
parameters:
- x-go-name: ID
name: id
in: path
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/conversationSuggestionResponse'
'401':
$ref: '#/components/responses/unauthorizedError'
'403':
$ref: '#/components/responses/forbiddenError'
'404':
$ref: '#/components/responses/notFoundError'
default:
$ref: '#/components/responses/genericError'
components:
responses:
notFoundError:
description: Not found error
conversationResponse:
description: HTTP status code 200 and conversation model
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
conversationSuggestionResponse:
description: HTTP status code 200 and conversation suggestion response
content:
application/json:
schema:
$ref: '#/components/schemas/ConversationSuggestionResponse'
noContentResponse:
description: Everything went as planned
genericError:
description: An unknown, unexpected error.
aiReplySuggestionsResponse:
description: HTTP status code 200 and array of AI reply suggestion models with messages
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/AiReplySuggestion'
unauthorizedError:
description: Unauthorized error
listConversationResponse:
description: HTTP status code 200 and array of conversation models
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Conversation'
badRequestError:
description: Invalid input or state means you're bad
headers:
Error:
schema:
type: string
forbiddenError:
description: Forbidden error
schemas:
Plan:
type: object
properties:
allow_unregistered:
type: boolean
x-go-name: AllowUnregistered
approved_vehicle_types:
$ref: '#/components/schemas/DBStringSlice'
bundle_required:
type: boolean
x-go-name: BundleRequired
claims_number:
type: string
x-go-name: ClaimsNumber
comp_policy_url:
type: string
x-go-name: CompPolicyURL
comprehensive_coverage:
type: boolean
x-go-name: ComprehensiveCoverage
comprehensive_maximum:
type: string
x-go-name: ComprehensiveMaximum
country:
type: string
x-go-name: Country
created:
type: string
x-go-name: Created
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
created_by_id:
type:
- integer
- 'null'
format: int64
dealer_only:
type: boolean
x-go-name: DealerOnly
hidden:
type: boolean
x-go-name: Hidden
id:
description: 'The fields below are returned in the minimum response when this
insurance plan is an element inside a rental'
type: integer
format: int64
x-go-name: ID
insurance_address_1:
type: string
x-go-name: InsuranceAddress1
insurance_city:
type: string
x-go-name: InsuranceCity
insurance_end_date:
type: string
x-go-name: InsuranceEndDate
insurance_name:
type: string
x-go-name: InsuranceName
insurance_plan_override:
$ref: '#/components/schemas/PlanOverride'
insurance_policy_number:
type: string
x-go-name: InsurancePolicyNumber
insurance_start_date:
type: string
x-go-name: InsuranceStartDate
insurance_state:
type: string
x-go-name: InsuranceState
insurance_zip:
type: string
x-go-name: InsuranceZip
insured_address_1:
type: string
x-go-name: InsuredAddress1
insured_city:
type: string
x-go-name: InsuredCity
insured_name:
type: string
x-go-name: InsuredName
insured_state:
type: string
x-go-name: InsuredState
insured_zip:
type: string
x-go-name: InsuredZip
label:
type: string
x-go-name: Label
last_updated_by_id:
type:
- integer
- 'null'
format: int64
liability_coverage:
type: boolean
x-go-name: LiabilityCoverage
liability_maximum:
type: string
x-go-name: LiabilityMaximum
liability_policy_url:
type: string
x-go-name: LiabilityPolicyURL
locality:
type: string
x-go-name: Locality
minimum_daily_fee:
type: integer
format: uint64
x-go-name: MinimumDailyFee
minimum_year:
type: integer
format: int64
x-go-name: MinimumYear
owner_comprehensive_deductible:
type: string
x-go-name: OwnerComprehensiveDeductible
owner_fee_percentage:
type: number
format: double
x-go-name: OwnerFeePercentage
owner_liability_deductible:
type: string
x-go-name: OwnerLiabilityDeductible
owner_liability_maximum:
type: string
x-go-name: OwnerLiabilityMaximum
rental_category:
type: string
x-go-name: RentalCategory
renter_comprehensive_deductible:
type: string
x-go-name: RenterComprehensiveDeductible
renter_fee_percentage:
type: number
format: double
x-go-name: RenterFeePercentage
renter_liability_deductible:
type: string
x-go-name: RenterLiabilityDeductible
renter_liability_maximum:
type: string
x-go-name: RenterLiabilityMaximum
requires_driver_verification:
type: boolean
x-go-name: RequiresDriverVerification
tiered:
type: boolean
x-go-name: Tiered
updated:
type: string
x-go-name: Updated
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
x-go-package: github.com/outdoorsy/api/internal/insurance
bookingConsignment:
type: object
properties:
keep_amt_cc_fee:
type: integer
format: int64
x-go-name: KeepAmountCCFee
keep_amt_insurance_fee:
type: integer
format: int64
x-go-name: KeepAmountInsuranceFee
keep_pct_cc_fee:
type: number
format: double
x-go-name: KeepPctCCFee
keep_pct_insurance_fee:
type: number
format: double
x-go-name: KeepPctInsuranceFee
pay_amt_total:
type: integer
format: int64
x-go-name: PayAmountTotal
pay_pct_generator:
type: number
format: double
x-go-name: PayPctGenerator
pay_pct_mileage:
description: Consigned owner support - copied rental data
type: number
format: double
x-go-name: PayPctMileage
payout_id:
$ref: '#/components/schemas/ConsignedPayout'
x-go-package: github.com/outdoorsy/api/model
Conversation:
type: object
properties:
all_statuses:
type: string
x-go-name: AllStatuses
archived:
type: boolean
x-go-name: Archived
bookings:
type: array
items:
$ref: '#/components/schemas/Booking'
x-go-name: Bookings
created:
type: string
x-go-name: Created
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
created_by_id:
type: integer
format: int64
id:
type: integer
format: int64
x-go-name: ID
last_location_id:
type: integer
format: int64
x-go-name: LastLocationID
messages:
type: array
items:
$ref: '#/components/schemas/Message'
x-go-name: Messages
num_messages:
type: integer
format: uint64
x-go-name: NumMessages
owner_id:
type: integer
format: int64
owner_sms_proxy_id:
type:
- string
- 'null'
owner_summary:
x-go-name: OwnerSummary
read:
type: boolean
x-go-name: Read
renter_id:
type: integer
format: int64
renter_sms_proxy_id:
type:
- string
- 'null'
renter_summary:
description: Generated in memory
x-go-name: RenterSummary
sms_proxy_closed:
type:
- boolean
- 'null'
sms_proxy_session_id:
type:
- string
- 'null'
time_to_first_action:
type:
- integer
- 'null'
format: int64
updated:
type: string
x-go-name: Updated
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
x-go-package: github.com/outdoorsy/api/model
SearchFilters:
type: object
properties:
festival_friendly:
type: boolean
x-go-name: FestivalFriendly
make:
type: string
x-go-name: Make
model:
type: array
items:
type: string
x-go-name: Model
pet_friendly:
type: boolean
x-go-name: PetFriendly
smoking_allowed:
type: boolean
x-go-name: SmokingAllowed
tailgate_friendly:
type: boolean
x-go-name: TailgateFriendly
towing_capacity:
type: integer
format: int64
x-go-name: TowingCapacity
towing_vehicle_make:
type: string
x-go-name: TowingVehicleMake
towing_vehicle_model:
type: string
x-go-name: TowingVehicleModel
towing_vehicle_year:
type: integer
format: int64
x-go-name: TowingVehicleYear
travelers:
type: integer
format: int64
x-go-name: Travelers
year_max:
type: integer
format: int64
x-go-name: YearMax
year_min:
type: integer
format: int64
x-go-name: YearMin
x-go-package: github.com/outdoorsy/api/types
SiblingBooking:
description: 'SiblingBooking embedded struct to get around Booking struct issues where we only render the first
instance in the response then simply render the booking ID.
See `func (b *Booking) ResponseElementData(options objx.Map)` for more details.'
type: object
properties:
abandoned:
type: boolean
x-go-name: Abandoned
addons:
type: array
items:
$ref: '#/components/schemas/BookingItem'
x-go-name: Addons
adults:
type: integer
format: int64
x-go-name: Adults
affirm_details:
$ref: '#/components/schemas/AffirmDetails'
affirm_total:
description: Dynamically calculated. Not stored in DB
type: integer
format: int64
x-go-name: AffirmTotal
applicable_tos_version:
type: string
x-go-name: ApplicableToSVersion
attention:
type: array
items:
$ref: '#/components/schemas/AttentionItem'
x-go-name: Attention
auto_assign_group:
type:
- boolean
- 'null'
auto_insurance_type:
type: string
x-go-name: AutoInsuranceType
bid_id:
type: integer
format: int64
x-go-name: BidID
block_discount_code:
type: boolean
x-go-name: BlockDiscountCode
booked:
description: Not Mutable
type: string
x-go-name: Booked
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
booking_agent:
type: string
x-go-name: BookingAgentID
booking_color:
type:
- string
- 'null'
booking_token:
type: string
x-go-name: BookingToken
bundle_id:
description: 'calculated field that holds the result of whether the rental has this assigned
if not, will look at the user/owner'
type: string
x-go-name: BundleID
calculated_day_price:
type: integer
format: uint64
x-go-name: CalculatedDayPrice
calculated_total_paid:
type: integer
format: uint64
x-go-name: CalculatedTotalPaid
campaign:
description: dealer only
type: string
x-go-name: Campaign
campground_booking_url:
description: Contains the booking id so ember can call /bookings/:id/default-selections
type: string
x-go-name: CampgroundBookingURL
campground_data:
$ref: '#/components/schemas/SiblingBookingCampgroundData'
can_add_ending_generator_values:
type: boolean
x-go-name: CanAddEndingGeneratorValues
can_add_ending_mileage_values:
type: boolean
x-go-name: CanAddEndingMileageValues
can_add_starting_generator_values:
type: boolean
x-go-name: CanAddStartingGeneratorValues
can_add_starting_mileage_values:
type: boolean
x-go-name: CanAddStartingMileageValues
can_add_trip_protection:
description: CanAddTransaction is used to check if the guest can add a trip protection
type: boolean
x-go-name: CanAddTripProtection
can_apply_credits:
type: boolean
x-go-name: CanApplyCredits
can_cancel_trip_protection:
description: CanCancelTripProtection is used to check if the guest can cancel a trip protection
type: boolean
x-go-name: CanCancelTripProtection
can_charge_overage_fees:
type: boolean
x-go-name: CanChargeOverageFees
can_file_claim:
type: boolean
x-go-name: CanFileClaim
can_generate_weather_quote:
type: boolean
x-go-name: CanGenerateWeatherQuote
can_manage_security_deposit:
type: boolean
x-go-name: CanManageSecurityDeposit
can_manage_tax_rates:
description: used by dashboard to disable tax editing
type: boolean
x-go-name: CanManageTaxRates
can_renter_review:
type: boolean
x-go-name: CanRenterReview
can_renter_review_until:
type: string
x-go-name: CanRenterReviewUntil
can_see_contract:
type: boolean
x-go-name: CanSeeContract
can_suggest_date_change:
type: boolean
x-go-name: CanSuggestDateChange
can_suggest_delivery_change:
type: boolean
x-go-name: CanSuggestDeliveryChange
cancel_metadata:
$ref: '#/components/schemas/CancelMetadata'
cancel_policy:
type: string
x-go-name: CancelPolicy
cancel_reason:
type: string
x-go-name: CancelReason
canceled:
type: string
x-go-name: Canceled
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
cancellation_cutoff_date:
type: string
cancellation_refund_breakdown:
$ref: '#/components/schemas/CancellationRefundBreakdown'
cancellation_refund_percentage:
type: number
format: double
x-go-name: CancellationRefundPercentage
cc_fee_percentage:
description: Copied rental data - don't want rental changes to affect this booking
type: number
format: double
x-go-name: CCFeePercentage
checkin_stamp:
description: Internal
type: string
x-go-name: CheckinStamp
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
checkout_questions:
$ref: '#/components/schemas/DBMSISlice'
checkout_stamp:
type: string
x-go-name: CheckoutStamp
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
checkout_steps_id:
type: integer
format: int64
x-go-name: CheckoutStepsID
children:
type: integer
format: int64
x-go-name: Children
coachnet_id:
type: integer
format: int64
x-go-name: CoachnetID
coachnet_premium:
type: integer
format: uint64
x-go-name: CoachnetPremium
consignment:
$ref: '#/components/schemas/bookingConsignment'
conversation_id:
type: integer
format: int64
created:
type: string
created_by_id:
type: integer
format: int64
created_stamp:
type: string
x-go-name: CreatedStamp
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
custom_insurance_text:
type:
- string
- 'null'
dealer_minimum_days:
description: used to display information if a booking is below the dealers minimum days
type: integer
format: uint64
x-go-name: DealerMinimumDays
decline_reason:
type: string
x-go-name: DeclineReason
default_insurance_coverage:
type: string
x-go-name: DefaultInsuranceCoverage
deliverable_campground:
$ref: '#/components/schemas/ExternalCampground'
delivery:
$ref: '#/components/schemas/BookingDelivery'
delivery_item:
$ref: '#/components/schemas/BookingItem'
delivery_usage_item:
x-go-name: DeliveryUsageItemJSON
delivery_usage_item_id:
type: integer
format: int64
deposit_percentage:
type: number
format: double
x-go-name: DepositPercentage
destination:
type: string
x-go-name: Destination
destination_lat:
type: number
format: double
x-go-name: DestinationLat
destination_lng:
type: number
format: double
x-go-name: DestinationLng
details:
$ref: '#/components/schemas/DBInterfaceMap'
device_id:
type: string
x-go-name: DeviceID
discount_code:
description: Copied discount code data, not allowed in request data.
type: string
x-go-name: DiscountCode
discount_code_amount:
type: integer
format: uint64
x-go-name: DiscountCodeAmount
discount_code_applied_to:
type: string
x-go-name: DiscountCodeAppliedTo
discount_code_message:
type: string
x-go-name: DiscountCodeMessage
display_insurance:
type: string
x-go-name: DisplayInsurance
display_source:
type: string
x-go-name: DisplaySource
display_status:
type: string
x-go-name: DisplayStatus
display_status_style:
type: string
x-go-name: DisplayStatusStyle
documents:
$ref: '#/components/schemas/BookingDocuments'
dropoff:
$ref: '#/components/schemas/BookingDropoff'
duration:
type: integer
format: uint64
x-go-name: Duration
esign_enabled:
type: boolean
x-go-name: EsignEnabled
esign_pending:
type: boolean
x-go-name: EsignPending
expire_reason:
type: string
x-go-name: ExpireReason
express_checkout_id:
type: integer
format: int64
x-go-name: ExpressCheckoutID
external:
type:
- boolean
- 'null'
external_gift_card_details:
$ref: '#/components/schemas/ExternalGiftCardDetails'
external_gift_card_details_v2:
type: array
items:
$ref: '#/components/schemas/ExternalGiftCardDetails'
x-go-name: ExternalGiftCardDetailsV2
fees_locked:
type: boolean
x-go-name: FeesLocked
fees_total:
type: integer
format: uint64
x-go-name: FeesTotal
final_payment_due_days:
type: integer
format: int64
x-go-name: FinalPaymentDueDays
followup_archived:
type: boolean
x-go-name: FollowupArchived
formatted:
$ref: '#/components/schemas/BookingDisplayFormatted'
formatted_total_overage_fee:
type: string
x-go-name: FormattedTotalOverageFee
fraudulent:
type: boolean
x-go-name: Fraudulent
free_cancellation_available:
type: boolean
x-go-name: FreeCancellationAvailable
free_cancellation_period:
type: integer
format: int64
x-go-name: FreeCancellationPeriod
from:
type: string
from_time:
type: integer
format: int64
x-go-name: FromTime
fx_fee_paid:
type: integer
format: int64
x-go-name: FXFeePaid
generator:
$ref: '#/components/schemas/BookingGenerator'
generator_item:
$ref: '#/components/schemas/BookingItem'
generator_usage_item:
x-go-name: GeneratorUsageItemJSON
generator_usage_item_id:
type: integer
format: int64
grace_period_ends_at:
type: string
x-go-name: GracePeriodEndsAt
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
handoff_summary:
$ref: '#/components/schemas/BookingHandoff'
has_approved_drivers:
type: boolean
x-go-name: HasApprovedDrivers
has_setup_intent_enabled:
type: boolean
x-go-name: HasSetupIntentEnabled
hold_sales_tax:
type: boolean
x-go-name: HoldSalesTax
house_rules:
type: string
x-go-name: HouseRules
id:
type: integer
format: int64
x-go-name: ID
import_id:
type: string
x-go-name: ImportID
imported:
description: owner only
type: boolean
x-go-name: Imported
include_coachnet:
type: boolean
x-go-name: IncludeCoachnet
infants:
type: integer
format: int64
x-go-name: Infants
initial_duration:
type: integer
format: uint64
x-go-name: InitialDuration
instamatch:
type:
- boolean
- 'null'
instant_book:
type: boolean
x-go-name: InstantBook
insurance:
type: string
x-go-name: Insurance
insurance_approved:
type: boolean
x-go-name: InsuranceApproved
insurance_approved_timestamp:
type: string
x-go-name: InsuranceApprovedTimeStamp
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
insurance_approved_updated_timestamp:
type: string
x-go-name: InsuranceApprovedUpdateTimeStamp
x-go-type: github.com/outdoorsy/api/clocks.RfcTime
insurance_bundle:
description: Using an interface{} to avoid import cycle and from having to move structs into the models package.
x-go-name: BookingBundle
insurance_claim_filed:
type: boolean
x-go-name: InsuranceClaimFiled
insurance_coverage:
type: string
x-go-name: InsuranceCoverage
insurance_plan_id:
$ref: '#/components/schemas/Plan'
insurance_renter_adjustable:
type: boolean
x-go-name: InsuranceRenterAdjustable
internal_notes:
type: string
x-go-name: InternalNotes
is_request_less_than_minimum_days:
type: boolean
x-go-name: IsRequestLessThanMinimumDays
is_within_grace_period:
type: boolean
x-go-name: IsWithinGracePeriod
items:
description: Items, calculations, payouts
# --- truncated at 32 KB (169 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/outdoorsy/refs/heads/main/openapi/outdoorsy-conversations-api-openapi.yml