Tackle Private Offers API

AWS private-offer lifecycle (create, read, update, cancel, push to marketplace).

Operations 11

GET /private-offers List Private Offers #
POST /private-offers Create Private Offer #
GET /private-offers/{id} Get Private Offer #
PUT /private-offers/{id} Update Private Offer #
DELETE /private-offers/{id} Delete Private Offer #
POST /private-offers/{id}/cancel Cancel Private Offer #
POST /private-offers/{id}/marketplace-create Push Private Offer to AWS Marketplace #
POST /api/private-offers/{id} Update a Microsoft offer #
GET /api/private-offers/{id} Get an offer #
POST /api/private-offers Create or import a Microsoft offer #
GET /api/private-offers List offers #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/tackle-private-offers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

tackle-private-offers-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Tackle Authentication Private Offers API
  description: Authenticated programmatic access to Tackle's webhooks, metering, private offers, and more.
  version: 1.0.0
  contact:
    name: Tackle Support
    email: support@tackle.io
    url: https://tackle.io
servers:
- url: https://api.tackle.io
tags:
- name: Private Offers
  description: AWS private-offer lifecycle (create, read, update, cancel, push to marketplace).
paths:
  /private-offers:
    get:
      summary: List Private Offers
      description: 'Returns a paginated list of private offers visible to the authenticated

        principal. Results may be filtered by status, marketplace, offer type,

        product reference, salesforce opportunity ID, and creation date.


        **Required RBAC permission:** `offers:ListOffers`

        '
      operationId: listPrivateOffers
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      parameters:
      - name: status
        in: query
        required: false
        description: Filter by offer status (e.g. `draft`, `created`, `accepted`, `cancelled`).
        schema:
          type: string
      - name: offer_ref
        in: query
        required: false
        description: Filter by marketplace offer reference (e.g. AWS `offer-*` ID).
        schema:
          type: string
      - name: type
        in: query
        required: false
        description: Filter by offer type.
        schema:
          type: string
          enum:
          - direct
          - partner_resale
      - name: product_ref
        in: query
        required: false
        description: Filter by Tackle product ID.
        schema:
          type: string
      - name: created_at
        in: query
        required: false
        description: Filter to offers created on the given `YYYY-MM-DD` date.
        schema:
          type: string
          format: date
      - name: created_at_gt
        in: query
        required: false
        description: Filter to offers created strictly after the given date.
        schema:
          type: string
          format: date
      - name: created_at_lt
        in: query
        required: false
        description: Filter to offers created strictly before the given date.
        schema:
          type: string
          format: date
      - name: salesforce_opportunity_id
        in: query
        required: false
        description: Filter by associated Salesforce Opportunity ID.
        schema:
          type: string
      - name: sort
        in: query
        required: false
        description: 'Sort expression. Prefix a field name with `-` for descending order

          (e.g. `-created_at`).

          '
        schema:
          type: string
      - name: offset
        in: query
        required: false
        description: Zero-based offset for pagination.
        schema:
          type: integer
          minimum: 0
          default: 0
      - name: limit
        in: query
        required: false
        description: Page size (1–100).
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 100
      responses:
        '200':
          description: Paginated list of private offers.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateOfferList'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      summary: Create Private Offer
      description: 'Creates a draft private offer. Set `create_in_marketplace: true` in the

        request body to also push the offer to AWS Marketplace in the same

        call; otherwise the offer is saved as a Tackle draft that can be

        pushed later via `POST /private-offers/{id}/marketplace-create`.


        Set `dry_run: true` to validate the payload without persisting the

        offer; a successful dry run returns `200 OK` instead of `201 Created`.


        **Required RBAC permission:** `offers:CreateDraftOffer`

        '
      operationId: createPrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePrivateOfferRequest'
      responses:
        '200':
          description: Dry-run validation succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePrivateOfferResponse'
        '201':
          description: Private offer created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePrivateOfferResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /private-offers/{id}:
    parameters:
    - $ref: '#/components/parameters/PrivateOfferId'
    get:
      summary: Get Private Offer
      description: 'Returns a single private offer by its Tackle ID.


        **Required RBAC permission:** `offers:GetOffer`

        '
      operationId: getPrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      responses:
        '200':
          description: Private offer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateOffer'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      summary: Update Private Offer
      description: 'Updates an existing draft private offer. The body has the same shape as

        `POST /private-offers` (`CreatePrivateOfferRequest`).


        **Required RBAC permission:** `offers:CreateDraftOffer` (the create

        permission also gates updates -- updating a draft is treated as the

        same authorization concept as creating one).

        '
      operationId: updatePrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePrivateOfferRequest'
      responses:
        '200':
          description: Updated private offer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePrivateOfferResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      summary: Delete Private Offer
      description: 'Deletes a draft private offer.


        **Required RBAC permission:** `offers:UpdateOffer` (the update

        permission also gates deletes -- "removing a draft" is treated as a

        kind of update).

        '
      operationId: deletePrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      responses:
        '204':
          description: Private offer deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /private-offers/{id}/cancel:
    parameters:
    - $ref: '#/components/parameters/PrivateOfferId'
    post:
      summary: Cancel Private Offer
      description: 'Cancels a private offer that has been pushed to AWS Marketplace but

        not yet accepted by the buyer. The cancellation is performed

        asynchronously; the response indicates that the request has been

        accepted, not that the cancellation is complete. Track completion via

        the offer''s `status` and `activities` fields, or via webhooks.


        **Required RBAC permission:** `offers:CancelOffer`

        '
      operationId: cancelPrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      responses:
        '200':
          description: Cancellation request accepted.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Offer is not in a state that can be cancelled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /private-offers/{id}/marketplace-create:
    parameters:
    - $ref: '#/components/parameters/PrivateOfferId'
    post:
      summary: Push Private Offer to AWS Marketplace
      description: 'Promotes a Tackle draft private offer (one created with

        `create_in_marketplace: false`) into AWS Marketplace. The push is

        asynchronous; this endpoint returns immediately once the request has

        been queued.


        **Required RBAC permission:** `offers:CreateOfferOnMarketplace`

        '
      operationId: marketplaceCreatePrivateOffer
      tags:
      - Private Offers
      security:
      - TackleJwt: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MarketplaceCreatePrivateOfferRequest'
      responses:
        '200':
          description: Dry-run validation succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketplaceCreatePrivateOfferRequest'
        '201':
          description: Marketplace creation request accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketplaceCreatePrivateOfferRequest'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Offer is not eligible for marketplace creation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/private-offers/{id}:
    post:
      tags:
      - Private Offers
      summary: Update a Microsoft offer
      description: 'Updates an existing Microsoft private offer. If `status` is

        `submit_to_cloud`, the handler merges EULA documents when present,

        validates the request, and stores the Microsoft submission payload.


        Required RBAC action: `offers:UpdateOffer`. Submitting to Microsoft also

        requires `offers:CreateOfferOnMarketplace`.

        '
      operationId: updatePrivateOffer
      security:
      - bearerAuth: []
      parameters:
      - $ref: '#/components/parameters/OfferId'
      - $ref: '#/components/parameters/TackleOperationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOffer'
            examples:
              updateDraftOffer:
                summary: Update and keep the offer in Tackle only
                description: 'Use `draft_status` to save the update in Tackle without preparing

                  or submitting a Microsoft marketplace payload.

                  '
                value:
                  status: draft_status
                  name: Updated draft offer
                  description: Updated draft description
              updateCloudOffer:
                summary: Update and submit the offer to Microsoft
                description: 'Use `submit_to_cloud` to validate the offer, merge EULA documents

                  when present, and prepare the Microsoft marketplace payload. This

                  also requires the `offers:CreateOfferOnMarketplace` RBAC action.

                  '
                value:
                  status: submit_to_cloud
                  name: Updated cloud offer
                  description: Updated cloud offer description
                  eula:
                    type: custom
                    document_urns:
                    - document-urn-1
      responses:
        '200':
          description: Offer updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateOffer_2'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError_2'
    get:
      tags:
      - Private Offers
      summary: Get an offer
      description: 'Returns one private offer by Tackle offer ID after checking that the

        caller can access the offer''s vendor.


        Required RBAC action: `offers:GetOffer`.

        '
      operationId: getPrivateOffer
      security:
      - bearerAuth: []
      parameters:
      - $ref: '#/components/parameters/OfferId'
      - $ref: '#/components/parameters/TackleOperationId'
      responses:
        '200':
          description: Offer found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateOffer_2'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError_2'
  /api/private-offers:
    post:
      tags:
      - Private Offers
      summary: Create or import a Microsoft offer
      description: 'Creates a new Microsoft private offer from a full offer payload, or

        imports an existing live Microsoft private offer when the body contains

        `microsoftOfferId` and `buyer_company_name`.


        For full create payloads, if `status` is `submit_to_cloud`, the handler

        validates and transforms the request for Microsoft submission before

        saving the offer. For import payloads, the vendor context is derived

        from the authenticated principal; sandbox vendors use their production

        parent vendor''s Microsoft credentials.


        Required RBAC action: `offers:CreateDraftOffer`. Submitting to Microsoft

        also requires `offers:CreateOfferOnMarketplace`.

        '
      operationId: createPrivateOffer
      security:
      - bearerAuth: []
      parameters:
      - $ref: '#/components/parameters/TackleOperationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
              - $ref: '#/components/schemas/CreateOffer'
              - $ref: '#/components/schemas/ImportMicrosoftOfferRequest'
            examples:
              createDraftOffer:
                summary: Create a Tackle-only draft
                description: 'Use `draft_status` to save the offer in Tackle without preparing

                  or submitting a Microsoft marketplace payload.

                  '
                value:
                  offer_type: direct
                  vendor_id: vendor-123
                  status: draft_status
                  vendor_name: Example Vendor
                  product_id: product-123
                  product_name: Example Product
                  buyer_details:
                    company_name: Example Buyer
                    billing_account_id: billing-account-123
                  eula:
                    type: standard
                    document_urns: []
                  pricing:
                    plan_name: Example Plan
                    description: Annual plan
                    contract_duration:
                      type: month
                      frequency: 12
                    payment_model: OneTime
                    payment_installments:
                      price_per_payment_in_usd: 1200
                    pricing_type: flat_rate
              createCloudOffer:
                summary: Create and submit to Microsoft
                description: 'Use `submit_to_cloud` to validate the offer and prepare the

                  Microsoft marketplace payload. This also requires the

                  `offers:CreateOfferOnMarketplace` RBAC action.

                  '
                value:
                  offer_type: direct
                  vendor_id: vendor-123
                  status: submit_to_cloud
                  vendor_name: Example Vendor
                  product_id: product-123
                  product_name: Example Product
                  name: Example Microsoft Offer
                  preparer_email: seller@example.com
                  start_on: acceptance
                  end_date: '2027-04-30'
                  accept_by_date: '2026-05-31'
                  buyer_details:
                    company_name: Example Buyer
                    billing_account_id: billing-account-123
                    buyers:
                    - full_name: Buyer User
                      email_address: buyer@example.com
                      title: Procurement
                  eula:
                    type: custom
                    document_urns:
                    - document-urn-1
                  pricing:
                    plan_name: Example Plan
                    description: Annual plan
                    contract_duration:
                      type: month
                      frequency: 12
                    payment_model: OneTime
                    payment_installments:
                      price_per_payment_in_usd: 1200
                    pricing_type: flat_rate
              importMicrosoftOffer:
                summary: Import an existing Microsoft offer
                description: 'Use `microsoftOfferId` with `buyer_company_name` to import an

                  existing live Microsoft private offer into Tackle. Optionally

                  include `salesforce_opportunity_id` to associate the imported

                  offer with a Salesforce opportunity. The Microsoft offer must

                  be supported by Tackle: live state, a single product listing

                  and plan, a single buyer, and supported USD pricing.

                  '
                value:
                  microsoftOfferId: ms-offer-123
                  buyer_company_name: Example Buyer
                  salesforce_opportunity_id: 6000000000001
      responses:
        '200':
          description: Offer created or imported
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrivateOffer_2'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '500':
          $ref: '#/components/responses/InternalServerError_2'
    get:
      tags:
      - Private Offers
      summary: List offers
      description: 'Finds the authenticated seller''s offers, optionally filtered by Microsoft

        offer reference or Microsoft plan reference. Vendor scope is derived

        from the bearer token; no vendor identifier is accepted from the caller.


        Required RBAC action: `offers:ListOffers`.

        '
      operationId: listPrivateOffers
      security:
      - bearerAuth: []
      parameters:
      - $ref: '#/components/parameters/OfferRef'
      - $ref: '#/components/parameters/PlanRef'
      - $ref: '#/components/parameters/TackleOperationId'
      responses:
        '200':
          description: Offers matching the search
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PrivateOffer_2'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '500':
          $ref: '#/components/responses/InternalServerError_2'
components:
  schemas:
    PaymentModel:
      type: string
      enum:
      - PaymentSchedule
      - PerYear
      - OneTime
      - PerMonth
    PricingUnit:
      type: object
      description: AMI-only pricing unit.
      properties:
        unit:
          type:
          - string
          - 'null'
        hourly_price:
          type:
          - string
          - 'null'
        duration_price:
          type:
          - string
          - 'null'
    CreateOffer:
      type: object
      description: Request body for creating a Microsoft SaaS private offer.
      properties:
        offer_type:
          $ref: '#/components/schemas/OfferType'
        salesforce:
          oneOf:
          - $ref: '#/components/schemas/CreateSalesforce'
          - type: 'null'
        vendor_id:
          type: string
          description: Tackle vendor ID that owns the offer.
        state:
          $ref: '#/components/schemas/OfferStateValue'
        status:
          description: 'Use `draft_status` to create a Tackle-only draft. Use

            `submit_to_cloud` to validate the offer and prepare it for Microsoft

            marketplace submission.

            '
          $ref: '#/components/schemas/OfferStatus'
        marketplace_fee:
          type: number
          format: double
        vendor_name:
          type: string
        product_id:
          type: string
          description: Tackle product ID.
        product_name:
          type: string
        source:
          oneOf:
          - $ref: '#/components/schemas/Source'
          - type: 'null'
        clone:
          oneOf:
          - $ref: '#/components/schemas/Clone'
          - type: 'null'
        metadata:
          type: object
          additionalProperties:
            type: string
        pre_registration_details:
          oneOf:
          - $ref: '#/components/schemas/PreRegistrationDetails'
          - type: 'null'
        partner:
          oneOf:
          - $ref: '#/components/schemas/Partner'
          - type: 'null'
        notes:
          type:
          - string
          - 'null'
        name:
          type:
          - string
          - 'null'
        description:
          type:
          - string
          - 'null'
        buyer_details:
          $ref: '#/components/schemas/BuyerDetails'
        renewal:
          type: boolean
        eula:
          $ref: '#/components/schemas/EULA_2'
        product_ref:
          type: string
          description: Microsoft product reference.
        users_to_notify:
          type: array
          items:
            $ref: '#/components/schemas/CreateUserToNotify'
        pricing:
          $ref: '#/components/schemas/OfferPricing'
        preparer_email:
          type: string
          format: email
        start_on:
          $ref: '#/components/schemas/StartOn'
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        accept_by_date:
          type: string
          format: date
        plan_template:
          $ref: '#/components/schemas/PlanTemplate'
      example:
        offer_type: direct
        vendor_id: vendor-123
        status: draft_status
        vendor_name: Example Vendor
        product_id: product-123
        product_name: Example Product
        buyer_details:
          company_name: Example Buyer
          billing_account_id: billing-account-123
          buyers:
          - full_name: Buyer User
            email_address: buyer@example.com
            title: Procurement
        eula:
          type: standard
          document_urns: []
        pricing:
          plan_name: Example Plan
          description: Annual plan
          contract_duration:
            type: month
            frequency: 12
          payment_model: OneTime
          payment_installments:
            price_per_payment_in_usd: 1200
          pricing_type: flat_rate
        start_on: acceptance
        start_date: '2026-05-01'
        end_date: '2027-04-30'
        accept_by_date: '2026-05-31'
        plan_template:
          ref: plan-template-123
          display: Standard plan
    UsageDimension:
      type: object
      properties:
        description:
          type:
          - string
          - 'null'
          description: Human-friendly name of the usage dimension.
        sku:
          type:
          - string
          - 'null'
          description: API identifier of the usage dimension in AWS Marketplace.
        price:
          type:
          - string
          - 'null'
          description: Price per unit.
        aws_discount_percentage:
          type:
          - string
          - 'null'
          description: Display-only discount percentage.
    Pricing:
      type: object
      description: 'Pricing configuration for an offer. Used for all cloud marketplaces,

        offer types, and product types. Many fields are conditional on

        `payment_model` and `billing_term`; consult the field descriptions

        for applicability.

        '
      properties:
        show_on_email:
          type:
          - boolean
          - 'null'
          description: Whether to show pricing on the buyer's order-notification email.
        marketplace_fee:
          type:
          - string
          - 'null'
          description: The marketplace's fee for the offer as a percentage. Used to compute contract values.
        net_contract_value:
          type:
          - string
          - 'null'
          readOnly: true
          description: Expected contract value after the marketplace fee is deducted.
        monthly_contract_value:
          type:
          - string
          - 'null'
          readOnly: true
        total_contract_value:
          type:
          - string
          - 'null'
          readOnly: true
        dimensions:
          type:
          - array
          - 'null'
          description: Base pricing categories with custom pricing.
          items:
            $ref: '#/components/schemas/PricingDimension'
        usage_dimensions:
          type:
          - array
          - 'null'
          description: Metered dimensions with custom pricing.
          items:
            $ref: '#/components/schemas/UsageDimension'
        units:
          type:
          - array
          - 'null'
          description: AMI-only pricing units.
          items:
            $ref: '#/components/schemas/PricingUnit'
        currency_code:
          type:
          - string
          - 'null'
          pattern: ^[A-Z]{3}$
          description: 3-letter ISO 4217 currency code.
          example: USD
        version:
          type:
          - string
          - 'null'
          enum:
          - simple-pricing-v1-aws
        schedule:
          type:
          - array
          - 'null'
          description: Schedule of payments. Only applicable when `payment_model` is `payment_schedule`.
          items:
            $ref: '#/components/schemas/ScheduledPayment'
        payment_model:
          type:
          - string
          - 'null'
          enum:
          - payment_schedule
          - per_product
          - one_time
          - per_month
          - per_year
          - saas_subscription
          description: '`per_product` -- one-time fee up front when the offer is accepted.

            `payment_schedule` -- flexible payment schedule across the contract.

            `saas_subscription` -- pay-as-you-go usage-based pricing.

            '
        billing_term:
          type:
          - string
          - 'null'
          enum:
          - future_dated
          - custom
          - 1-month
          - 1-year
          - 2-years
          - 3-years
          description: 'Length of the contract. `custom` requires `duration_value`;

            `future_dated` requires `service_start_at` and `service_end_at`.

            '
        duration_value:
          type:
          - integer
          - 'null'
          description: Duration in months when `billing_term` is `custom`.
        duration_type:
          type:
          - string
          - 'null'
          description: Currently only `months` is supported.
        duration:
          type:
          - string
          - 'null'
          readOnly: true
          description: Human-friendly representation of duration value and type.
        service_start_at:
          type:
          - string
          - 'null'
          format: date
          description: Start date when `billing_term` is `future_dated`.
        service_end_at:
          type:
          - string
          - 'null'
          format: date
          description: End date when `billing_term` is `future_dated`.
        allow_auto_renew:
          type:
          - boolean
          - 'null'
    Buyer:
      type: object
      properties:
        email_address:
          type: string
          format: email
          description: The buyer's email used to send purchase instructions.
        full_name:
          type:
          - string
          - 'null'
        title:
          type:
          - string
          - 'null'
          description: Shown in Tackle notifications sent to the seller's team.
      required:
      - email_address
    InitialCharge:
      type: object
      properties:
        price_per_payment_in_usd:
          type:
          - number
          - 'null'
          format: double
        note:
          type:
          - string
          - 'null'
    MarketplaceCreatePrivateOfferRequest:
      type: object
      description: 'Request body for promoting an existing Tackle draft offer into AWS

        Marketplace. Only the wrapper options are accepted; the offer payload

        is taken from the existing draft.

        '
      properties:
        send_buyer_instructions:
          type: boolean
          description: Whether to send the buyer purchase-instructions email immediately.
        dry_run:
          type: boolean
          description: 'When `true`, validates that the offer can be pushed without

            actually pushing it. A successful dry run returns `200`; a

            successful push returns `201`.

            '
      required:
      - send_buyer_instructions
      - dry_run
    DimensionQuantity:
      type: object
      properties:
        dimension_term:
          $ref: '#/components/schemas/ContractDuration'
        unlimited_quantity:
          type: boolean
        quantity:
          type: number
          format: double
    UpdateUserToNotify:
      type: object
      properties:
        contact_type:
          type: string
        value:
          type: string
        email:
          type: string
          format: email
    PrivateOffer_2:
      type: object
      description: Stored Tackle Microsoft private offer.
      properties:
        po_id:
          type: string
        accepted_at:
          type:
          - string
          - 'null'
          format: date-time
        accepted_source:
          type:
          - string
          - 'null'
        archived_at:
          type:
          - string
          - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        cancelled_at:
          type:
          - string
          - 'null'
          format: date-time
        last_modified_at:
          type: string
          format: date-time
        last_update_source:
          type:
          - string
          - 'null'
        viewed_offer_at:
          type:
          - string
          - 'null'
          format: date-time
        sent_at:
          type:
          - string
          - 'nul

# --- truncated at 32 KB (72 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tackle/refs/heads/main/openapi/tackle-private-offers-api-openapi.yml