Beyond Pricing Webhooks API
The Webhooks API from Beyond Pricing — 0 operation(s) for webhooks.
The Webhooks API from Beyond Pricing — 0 operation(s) for webhooks.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/beyond-pricing-webhooks-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Beyond Pricing Public Webhooks API
version: 2.0.0
description: Bearer-protected API for third-party integrations. Supports OAuth2 client credentials and personal access tokens. Follows JSON:API specification.
tags:
- name: Webhooks
paths: {}
webhooks:
accountCreated:
post:
description: 'Sent when the background listing sync that follows `POST /users/{user_id}/accounts/` reaches a terminal state — every listing on the account has been pulled from the channel and created in Beyond, or the sync failed.
`succeeded` means the listings *exist*, not that they are priced. A listing becomes fully set up (base price computed) later, and each one emits its own `listing.created` event at that point.
The event fires the same way whether the account was newly created or an existing, previously deleted account was revived; in the revive case the restored listings are counted in `nb-listings-synced`.
Credential problems (invalid credentials, 2FA, channel outage) are reported synchronously on the `POST` response and emit no event.
Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Managed account listing sync completed
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/AccountCreatedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
accountRefreshed:
post:
description: 'Sent when the background listing sync started by `POST /users/{user_id}/accounts/{account_id}/refresh/` reaches a terminal state — every listing the refresh considered has been re-pulled from the channel, or the sync failed.
The event covers **listings only**. Reservations are refreshed by independent background jobs that outlive this event, so they are still in flight when it is delivered.
Listings synced within the last `recent-sync-threshold-minutes` are skipped and are not counted in `nb-listings-synced`. A refresh that skips every listing is still `succeeded`, with `nb-listings-synced` of 0.
Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Managed account refresh completed
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/AccountRefreshedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
listingBasePriceChanged:
post:
description: 'Sent whenever a listing''s effective base price changes — through the Partners API or any other Beyond surface. This covers the user-set base price changing, and — while no user base price is set — the starting base price Beyond''s algorithm computes from the listing''s characteristics changing from one value to another. The first-ever price (null → value) is delivered as `listing.created` instead, not here.
`enabled` reports whether the listing has pricing enabled: use it to tell a live price change (`enabled: true`) from a speculative one (`enabled: false`, e.g. a computed starting price on a not-yet-enabled listing).
`change-source` reports what moved the price: `user` for a change made by an authenticated actor (Partners API, the Beyond app, or an admin), or `system` for one made by an automatic process (Beyond''s algorithm computing a starting price, a scheduled auto-approved booking review, a background job). A change to the computed starting price is always `system`.
`changed-by` names the individual behind a `user` change by email. It is null when no individual is responsible: every `system` change, and any change made by a machine — an app-level (`client_credentials`) Partners API token acts for the account as a whole, so it names no person. Changes made by Beyond staff on your behalf report `support@beyondpricing.com` rather than an internal address.
The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. `old-base-price` is null the first time a base price is set. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Listing base price changed
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/ListingBasePriceChangedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
listingCreated:
post:
description: 'Sent when a new listing owned by one of your users is fully set up — after Beyond has computed its initial base price — and when an attempt to set one up fails. Use it to learn about new listings, and about listings that need attention before they can be created, without polling. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header.
With `status=''succeeded''` the event fires once per listing, the first time its base price is computed. With `status=''failed''` it fires on every failing sync attempt — a listing whose channel setup stays broken repeats the event on each re-sync — carrying a human-readable `error`; the `listing` relationship and the listing attributes are null or omitted when the listing does not exist yet. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Listing created
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/ListingCreatedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
listingInActiveMarketChanged:
post:
description: 'Sent when a listing''s `in-active-market` attribute — the one the listings endpoint serves — changes. `in-active-market: true` guarantees the listing''s calendar endpoint works and automated price refresh is on; while false the calendar may return 400 ("not yet clustered") and price refresh is off. Subscribe to it to learn when a listing you already received leaves or re-enters that ready state, without polling.
The transition is rare: it happens when Beyond removes or re-assigns the listing''s pricing cluster, or activates/deactivates the listing''s market. It fires once per flip, in either direction — `in-active-market` carries the new value. A market-wide change (e.g. Beyond activating a market) reaches each listing on its next daily sync, so expect one event per affected listing spread over about a day. There is no failure variant. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Listing in-active-market changed
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/ListingInActiveMarketChangedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
listingRefreshed:
post:
description: 'Sent when a partner-triggered listing reservations refresh chain terminates — either both `sync_reservations` and `compute_abp_c` succeed, or any step fails. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header.
Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe.'
summary: Reservations refresh completed
tags:
- Webhooks
requestBody:
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/ListingRefreshedEvent'
required: true
responses:
'200':
description: Delivery acknowledged (any 2xx).
'410':
description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.
components:
schemas:
ListingCreatedEventChannelListings:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
channel:
type: string
description: Channel this channel listing belongs to (e.g. 'airbnb', 'hostaway').
channel-id:
type: string
description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records.
required:
- channel
- channel-id
ListingCreatedEventRelationships:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
listing:
$ref: '#/components/schemas/_Relationship'
user:
$ref: '#/components/schemas/_Relationship'
account:
$ref: '#/components/schemas/_Relationship'
required:
- user
_RelationshipLinks:
type: object
description: JSON:API ``relationships.<name>.links`` body — partner follow-up URL.
properties:
related:
type: string
format: uri
description: Absolute URL to GET the current state of the related resource
_EventMeta:
type: object
description: JSON:API top-level ``meta`` for partner events.
properties:
type:
type: string
description: Event type (e.g., 'listing.refreshed')
sent-at:
type: string
format: date-time
description: UTC timestamp the event envelope was assembled (RFC 3339)
required:
- sent-at
- type
ListingRefreshedEvent:
type: object
properties:
meta:
$ref: '#/components/schemas/_EventMeta'
data:
$ref: '#/components/schemas/ListingRefreshedEventData'
required:
- data
- meta
ListingBasePriceChangedEvent:
type: object
properties:
meta:
$ref: '#/components/schemas/_EventMeta'
data:
$ref: '#/components/schemas/ListingBasePriceChangedEventData'
required:
- data
- meta
ListingRefreshedEventRelationships:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
listing:
$ref: '#/components/schemas/_Relationship'
user:
$ref: '#/components/schemas/_Relationship'
account:
$ref: '#/components/schemas/_Relationship'
required:
- account
- listing
- user
AccountRefreshedEventRelationships:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
user:
$ref: '#/components/schemas/_Relationship'
account:
$ref: '#/components/schemas/_Relationship'
required:
- account
- user
ListingBasePriceChangedEventRelationships:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
listing:
$ref: '#/components/schemas/_Relationship'
user:
$ref: '#/components/schemas/_Relationship'
account:
$ref: '#/components/schemas/_Relationship'
required:
- listing
- user
ListingBasePriceChangedEventChannelListings:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
channel:
type: string
description: Channel this channel listing belongs to (e.g. 'airbnb', 'hostaway').
channel-id:
type: string
description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records.
required:
- channel
- channel-id
_Relationship:
type: object
description: 'Generic JSON:API to-one relationship — ``{data: {type, id}, links?}``.'
properties:
data:
$ref: '#/components/schemas/_RelationshipData'
links:
$ref: '#/components/schemas/_RelationshipLinks'
required:
- data
ListingCreatedEventData:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
type:
type: string
description: JSON:API resource type for this event
id:
type: string
description: ULID event identifier (msg_<base32>), same as the webhook-id header. Stable across delivery retries; dedupe on it.
attributes:
$ref: '#/components/schemas/ListingCreatedEventAttributes'
relationships:
$ref: '#/components/schemas/ListingCreatedEventRelationships'
required:
- attributes
- id
- relationships
- type
AccountCreatedEventRelationships:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
user:
$ref: '#/components/schemas/_Relationship'
account:
$ref: '#/components/schemas/_Relationship'
required:
- account
- user
ListingInActiveMarketChangedEventData:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
type:
type: string
description: JSON:API resource type for this event
id:
type: string
description: ULID event identifier (msg_<base32>), same as the webhook-id header. Stable across delivery retries; dedupe on it.
attributes:
$ref: '#/components/schemas/ListingInActiveMarketChangedEventAttributes'
relationships:
$ref: '#/components/schemas/ListingInActiveMarketChangedEventRelationships'
required:
- attributes
- id
- relationships
- type
AccountCreatedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
status:
enum:
- succeeded
- failed
type: string
description: 'Terminal outcome of the initial listing sync. ''succeeded'' means every listing on the account synced without error; ''failed'' means at least one listing failed, or the sync itself did not complete.
* `succeeded` - succeeded
* `failed` - failed'
completed-at:
type: string
format: date-time
description: UTC timestamp when the sync reached its terminal state (RFC 3339)
channel:
type: string
description: Channel the account is connected to (e.g. 'airbnb', 'hostaway').
nb-listings-synced:
type: integer
description: Number of listings successfully created (or, for a revived account, restored) on this account by the sync.
nb-listings-failed:
type:
- integer
- 'null'
description: Number of listings the sync could not create. Always present; 0 when status='succeeded'. It is null when the sync did not run to completion (for example an infrastructure failure or a channel-wide error), so the per-listing count is unknown — in that case nb-listings-synced reports how many listings exist on the account, and status is 'failed'.
error:
type:
- string
- 'null'
description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery.
required:
- channel
- completed-at
- nb-listings-failed
- nb-listings-synced
- status
ListingInActiveMarketChangedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
in-active-market:
type: boolean
description: 'The listing''s new in-active-market value — the same boolean the listings endpoint serves. true: the calendar endpoint works and automated price refresh is on. false: the calendar may return 400 and price refresh is off.'
changed-at:
type: string
format: date-time
description: UTC timestamp when the attribute changed (RFC 3339). Delivery order between the two directions is not guaranteed — order by this attribute, or fetch the listing for its current state.
title:
type:
- string
- 'null'
description: The listing's title.
channel-listings:
type: array
items:
$ref: '#/components/schemas/ListingInActiveMarketChangedEventChannelListings'
description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing.
required:
- changed-at
- channel-listings
- in-active-market
- title
_RelationshipData:
type: object
description: JSON:API ``relationships.<name>.data`` body — ``{type, id}``.
properties:
type:
type: string
description: JSON:API resource type
id:
type: string
description: Resource identifier
required:
- id
- type
AccountRefreshedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
status:
enum:
- succeeded
- failed
type: string
description: 'Terminal outcome of the refresh. ''succeeded'' means every listing the refresh considered synced without error; ''failed'' means at least one listing failed, or the sync itself did not complete.
* `succeeded` - succeeded
* `failed` - failed'
completed-at:
type: string
format: date-time
description: UTC timestamp when the refresh reached its terminal state (RFC 3339)
channel:
type: string
description: Channel the account is connected to (e.g. 'airbnb', 'hostaway').
nb-listings-synced:
type: integer
description: Number of listings the refresh successfully re-synced. Listings skipped as recently synced are not counted, so this can be lower than the account's listing count — and 0 when everything was skipped.
nb-listings-failed:
type:
- integer
- 'null'
description: Number of listings the refresh could not sync. Always present; 0 when status='succeeded'. It is null when the sync did not run to completion (for example an infrastructure failure or a channel-wide error), so the per-listing count is unknown — in that case nb-listings-synced reports how many listings exist on the account, and status is 'failed'.
recent-sync-threshold-minutes:
type: integer
description: The threshold the refresh ran with, echoed from the request. Listings synced within this many minutes were skipped. 0 means no listing was skipped.
error:
type:
- string
- 'null'
description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery.
required:
- channel
- completed-at
- nb-listings-failed
- nb-listings-synced
- recent-sync-threshold-minutes
- status
ListingBasePriceChangedEventData:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
type:
type: string
description: JSON:API resource type for this event
id:
type: string
description: ULID event identifier (msg_<base32>), same as the webhook-id header. Stable across delivery retries; dedupe on it.
attributes:
$ref: '#/components/schemas/ListingBasePriceChangedEventAttributes'
relationships:
$ref: '#/components/schemas/ListingBasePriceChangedEventRelationships'
required:
- attributes
- id
- relationships
- type
ListingBasePriceChangedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
new-base-price:
type: integer
description: The listing's new user-set base price, in the listing currency. A whole number — the same integer the listings endpoint exposes as base-price (fractional amounts are truncated toward zero).
old-base-price:
type:
- integer
- 'null'
description: The previous base price as a whole number, or null when the listing had no base price set before this change.
new-currency:
type:
- string
- 'null'
description: ISO 4217 currency code the new base price is denominated in.
old-currency:
type:
- string
- 'null'
description: ISO 4217 currency code of the previous base price. Differs from new-currency only when this change is a currency re-denomination; equal to new-currency for a plain price change.
changed-at:
type:
- string
- 'null'
format: date-time
description: UTC timestamp when the base price changed (RFC 3339).
channel-listings:
type: array
items:
$ref: '#/components/schemas/ListingBasePriceChangedEventChannelListings'
description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing.
enabled:
type: boolean
description: Whether the listing has pricing enabled. true means the price change is live; false means it is speculative — e.g. a change to the algorithm's computed starting price on a listing that is not yet enabled, or a user editing the base price before turning syncing on.
change-source:
enum:
- user
- system
type: string
description: 'What moved the base price. ''user'' — an authenticated actor (the Partners API, the Beyond app, or an admin). ''system'' — an automatic process (Beyond''s algorithm computing a starting price, a scheduled auto-approved booking review, a background job). A change to the computed starting price is always ''system''.
* `user` - user
* `system` - system'
changed-by:
type:
- string
- 'null'
description: Email of the individual who made a 'user' change, when there is one to name. Null for every 'system' change, and for a 'user' change made by a machine — an app-level (client_credentials) Partners API token acts for the account as a whole, not for a person. Changes made by Beyond staff on your behalf report 'support@beyondpricing.com'.
required:
- change-source
- changed-at
- changed-by
- channel-listings
- enabled
- new-base-price
- new-currency
- old-base-price
- old-currency
ListingRefreshedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
status:
enum:
- succeeded
- failed
type: string
description: 'Terminal outcome of the refresh chain. ''succeeded'' means both the reservations sync and the ABP-C recompute completed; ''failed'' means at least one step raised.
* `succeeded` - succeeded
* `failed` - failed'
completed-at:
type: string
format: date-time
description: UTC timestamp when the terminal job finished (RFC 3339)
channel:
type: string
description: Channel the refreshed listing belongs to (e.g. 'airbnb', 'hostaway').
channel-listing-id:
type: string
description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records.
error:
type:
- string
- 'null'
description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery.
required:
- channel
- channel-listing-id
- completed-at
- status
ListingCreatedEventAttributes:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
status:
enum:
- succeeded
- failed
type: string
description: 'Outcome of the listing setup. ''succeeded'' means the listing is fully set up with its initial base price computed; ''failed'' means a sync attempt could not create the listing.
* `succeeded` - succeeded
* `failed` - failed'
created-at:
type:
- string
- 'null'
format: date-time
description: UTC timestamp when the listing was created (RFC 3339). Null on a failed creation attempt where the listing does not exist yet.
title:
type:
- string
- 'null'
description: The listing's title.
currency:
type:
- string
- 'null'
description: ISO 4217 currency code the listing is denominated in.
base-price:
type:
- integer
- 'null'
description: The listing's initial base price, computed by Beyond when the listing was set up, in the listing currency. A whole number — the same integer the listings endpoint exposes as base-price (fractional amounts are truncated toward zero). Null on a failed creation attempt.
channel-listings:
type: array
items:
$ref: '#/components/schemas/ListingCreatedEventChannelListings'
description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing.
error:
type:
- string
- 'null'
description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery.
required:
- base-price
- channel-listings
- created-at
- currency
- status
- title
AccountCreatedEvent:
type: object
properties:
meta:
$ref: '#/components/schemas/_EventMeta'
data:
$ref: '#/components/schemas/AccountCreatedEventData'
required:
- data
- meta
ListingRefreshedEventData:
type: object
description: 'Dasherizes field names on output and un-dasherizes on input.
Apply to nested (non-resource) serializers so their keys match
the top-level JSON:API dasherized format. Top-level resource
serializers must NOT use this mixin (the renderer handles them).'
properties:
type:
type: string
description: JSON:API resource type for this event
id:
# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/beyond-pricing/refs/heads/main/openapi/beyond-pricing-webhooks-api-openapi.yml