> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thanks.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Estimate Notecard

> Price a notecard order without placing it. Send the same request body you would send to Send Notecard: nothing is charged, nothing is printed or mailed, and no order is created.

The request is validated exactly as the send is, so a payload the send would reject is rejected here too. Recipients with only an email address are priced as if the email-to-address lookup finds them, and counted in `pending_email_lookups`. A `radius_search` is counted and priced, but no records are purchased.



## OpenAPI

````yaml post /estimate/notecard
openapi: 3.1.0
info:
  title: thanks.io API
  description: >-
    Use the thanks.io API to send postcards, letters, notecards, windowless
    letters, and gift cards.
  contact:
    url: https://www.thanks.io
    email: support@thanks.io
  version: 1.0.0
servers:
  - url: https://api.thanks.io/api/v2
    description: The main API server for thanks.io
security:
  - bearerAuth: []
tags:
  - name: Recipients
  - name: Mailing Lists
  - name: Send Mailer
  - name: Order Estimates
  - name: Orders
  - name: Message Templates
  - name: Image Templates
  - name: Handwriting Styles
  - name: Giftcards
  - name: Dynamic Images
    description: ''
  - name: Image Builder
  - name: Sub Accounts
  - name: Webhooks
  - name: Webhook Events
externalDocs:
  description: Learn more about thanks.io
  url: https://docs.thanks.io
paths:
  /estimate/notecard:
    post:
      tags:
        - Order Estimates
      summary: Estimate Notecard
      description: >-
        Price a notecard order without placing it. Send the same request body
        you would send to Send Notecard: nothing is charged, nothing is printed
        or mailed, and no order is created.


        The request is validated exactly as the send is, so a payload the send
        would reject is rejected here too. Recipients with only an email address
        are priced as if the email-to-address lookup finds them, and counted in
        `pending_email_lookups`. A `radius_search` is counted and priced, but no
        records are purchased.
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/send-mailer-base'
                - type: object
                  properties:
                    image_template_id:
                      type: integer
                      description: >-
                        ID of image template to use for the exterior of the
                        notecard.   Required if not front_image_url is
                        specified.
                      example: 6
                    front_image_url:
                      type: string
                      description: >-
                        URL to image to use for the exterior of the notecard.
                        Required if image_template_id is not specified.
                      example: https://cdn.thanks.io/notecard-inspirations/note1.png
                    message:
                      type: string
                      description: >-
                        Handwritten message content to use for interior of
                        notecard.
                      example: >-
                        Hey %FIRST_NAME%!,


                        THANK YOU for allowing us the opportunity to HELP you
                        with your plan!
                    message_template_id:
                      type: integer
                      description: ID of message template to use for interior of notecard.
                      example: 12
                    use_custom_background:
                      type: boolean
                      description: >-
                        Use custom interior background image. This can be used
                        to turn off the default background image.
                      default: false
                    custom_background_image:
                      type: string
                      description: >-
                        URL to custom background image to use for interior of
                        notecard.  This image will be placed behind the
                        handwritten message.  Must be 1650px by 2475px.
                      example: >-
                        https://s3.amazonaws.com/content.thanks.io/templates/branding-builder-images/c09d39aadfc-3701d4467b8/44e9a510-78cb-11f0-a77d-dd13e72edce5.png
                    qrcode_url:
                      type: string
                      description: URL to Autogenerate QR Code in interior of notecard.
                      example: https://www.google.com
            examples:
              Image URL & Recipients:
                summary: Notecard with Custom Image and Recipients
                description: >-
                  Example of sending a notecard using a custom front image URL,
                  handwritten message, and an array of recipients with custom
                  fields.
                value:
                  front_image_url: https://cdn.thanks.io/notecard-inspirations/note1.png
                  message: >-
                    Hey %FIRST_NAME%!,


                    THANK YOU for allowing us the opportunity to HELP you with
                    your plan!
                  handwriting_style_id: 4
                  recipients:
                    - name: Current Resident
                      address: 123 Main Street
                      city: Fake City
                      province: NY
                      postal_code: '55555'
                      country: US
                      custom1: Example Custom 1
                      custom2: Example Custom 2
                      custom3: Example Custom 3
                      custom4: Example Custom 4
                    - name: Jane Doe
                      address: 456 Another St
                      city: Fake City
                      province: NY
                      postal_code: '55555'
                      country: US
      responses:
        '200':
          description: The order was priced. Nothing was charged and no order was created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/estimate-response'
              example:
                message: OK
                data:
                  type: notecard
                  size: null
                  total_recipients: 2
                  recipients:
                    united_states: 2
                    international: 0
                  pending_email_lookups: 0
                  costs_in_cents:
                    united_states: 236
                    international: 0
                    additional_pages: 0
                    giftcard_face_value: 0
                    grand_total: 236
                  total_cost_in_cents: 236
                  total_cost: $2.36
                  current_balance_in_cents: 5000
                  covered_by_balance: true
                  test_mode: false
                  notes: []
        '400':
          $ref: '#/components/responses/UserError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          description: >-
            API access has been temporarily disabled due to repeated payment
            failures.
          content:
            application/json:
              example:
                status: >-
                  API access has been temporarily disabled due to repeated
                  payment failures. Please update your payment method.
                message: >-
                  API access has been temporarily disabled due to repeated
                  payment failures. Please update your payment method.
                code: api_disabled_payment_failures
        '422':
          description: >-
            Validation failed on the request body, exactly as it would on the
            matching send.
components:
  schemas:
    send-mailer-base:
      type: object
      properties:
        preview:
          type: boolean
          description: >-
            Set to true to return a preview instead of sending the mail piece.
            You can use this with any send call to inspect the output before
            submitting the order.
          example: true
        mailing_list_ids:
          type: array
          description: >-
            Mailing list IDs to send to. Required if `recipients` and
            `radius_search` are not provided.
          items:
            type: integer
          example:
            - 5166
            - 514
        recipients:
          type: array
          description: >-
            Recipients to send to. Required if `mailing_list_ids` and
            `radius_search` are not provided.
          items:
            $ref: '#/components/schemas/recipient-create-no-mailinglist'
        radius_search:
          type: object
          description: >-
            Use a radius search to find recipients near an address. Required if
            `mailing_list_ids` and `recipients` are not provided. Lookup fees
            are $0.05 per record.
          properties:
            preview:
              type: boolean
              description: >-
                Return a preview of the number of matching recipients and the
                estimated cost.
              default: false
            address:
              type: string
              example: 123 Main Street, Fake City, NY, 55555
              description: >-
                Full street address to use as the center point of the
                nearest-neighbor search.
            record_count:
              type: integer
              description: Number of nearby records to return.
              minimum: 1
              maximum: 10000
              example: 1
            record_types:
              type: string
              description: Record type to search for
              enum:
                - all
                - likelytomove
                - likelytorefi
                - absenteeowner
                - highnetworth
                - majorityhomeequity
                - homefreeclear
                - underwater
                - kidsinhousehold
                - newhomeowner
                - firsttimehomebuyer
                - renters
                - retiring
                - retired
                - pool
                - onlybusinesses
                - newbusiness
              default: all
            include_condos:
              type: boolean
              description: Include condos in search.
              default: false
            append_data:
              type: boolean
              description: >-
                Append phone and email to each record for an additional fee
                ($.20 per record).
              default: false
            use_property_owner:
              type: boolean
              description: >-
                Use the property owner's address when searching commercial
                records.
              default: false
            include_search_address:
              type: boolean
              description: >-
                Set to true to include the search address in the generated
                mailing list.
        handwriting_style_id:
          type: integer
          description: ID of handwriting style to use.
          example: 4
        handwriting_color:
          type: string
          description: >-
            Handwriting color to use. Options are preset named colors or
            specified as hex format, such as '#4287f5'
          enum:
            - blue
            - black
            - green
            - purple
            - red
          examples:
            - blue
            - '#4287f5'
        handwriting_realism:
          type: boolean
          description: Set to true to enable the realism effect for AI fonts.
          example: true
        sub_account:
          type: integer
          description: Sub-account ID to use for this order.
          example: 7
        notification_emails:
          type: string
          description: >-
            Optional comma-separated list of email addresses to notify about
            order events such as QR scan notifications.
          example: ops@example.com,sales@example.com
        send_standard_mail:
          type: boolean
          description: >-
            Set to true to use Standard Mail postage. If false or omitted,
            account default is used.
          default: false
        return_name:
          type: string
          description: Custom return name for the order.
          example: Custom Return
        return_address:
          type: string
          description: Custom return address for the order.
          example: 1 Main Street
        return_address2:
          type: string
          description: Custom return address line 2 for the order.
          example: Unit 1
        return_city:
          type: string
          description: Custom return city for the order.
          example: Woodbridge
        return_state:
          type: string
          description: Custom return state/province for the order.
          example: NJ
        return_postal_code:
          type: string
          description: Custom return postal code for the order.
          example: '07095'
        metadata:
          type:
            - object
            - 'null'
          description: >-
            Your own key/value data to store with the order. It is returned
            unchanged by the order endpoints and included in every webhook event
            for the order as `order.metadata`. Must be a JSON object rather than
            an array, and no larger than 8,192 bytes once encoded as JSON.
            thanks.io does not print or otherwise act on these values.
          additionalProperties: true
          example:
            crm_deal_id: D-1042
            campaign: spring-winback
            source: hubspot
    estimate-response:
      type: object
      title: Estimate Response
      properties:
        message:
          type: string
          example: OK
        data:
          type: object
          properties:
            type:
              type: string
              description: >-
                Mailer type that was priced. A 6x11 postcard is reported as
                `postcard6x11`.
              enum:
                - postcard
                - postcard6x11
                - letter
                - windowlessletter
                - notecard
                - magnacard
                - giftcard
              example: postcard
            size:
              type:
                - string
                - 'null'
              description: Postcard size that was priced. `null` for other mailer types.
              example: 4x6
            total_recipients:
              type: integer
              description: Number of pieces the order would mail.
              example: 2
            recipients:
              type: object
              description: '`total_recipients` split by destination.'
              properties:
                united_states:
                  type: integer
                  example: 2
                international:
                  type: integer
                  example: 0
            pending_email_lookups:
              type: integer
              description: >-
                Recipients sent with an email address but no mailing address.
                The estimate does not run the email-to-address lookup, so they
                are priced as if an address is found. Any whose address can't be
                found when you send are not mailed or charged.
              example: 0
            costs_in_cents:
              type: object
              description: Breakdown of the total, in cents.
              properties:
                united_states:
                  type: integer
                  description: Printing and postage for US pieces.
                  example: 236
                international:
                  type: integer
                  description: Printing and postage for international pieces.
                  example: 0
                additional_pages:
                  type: integer
                  description: >-
                    Additional letter pages, priced per page. `0` for other
                    mailer types.
                  example: 0
                giftcard_face_value:
                  type: integer
                  description: >-
                    Combined face value of every gift card in the order. `0` for
                    other mailer types.
                  example: 0
                grand_total:
                  type: integer
                  description: >-
                    Everything except gift card face value. This can include
                    fees not broken out above, such as radius search records.
                  example: 236
            total_cost_in_cents:
              type: integer
              description: >-
                The order total: `grand_total` plus `giftcard_face_value`. For
                every mailer type except gift cards, this is what the same
                request is charged when you send it. See Estimate Giftcard for
                how gift card face value is billed.
              example: 236
            total_cost:
              type: string
              description: '`total_cost_in_cents` formatted in dollars.'
              example: $2.36
            current_balance_in_cents:
              type: integer
              description: Your account's credit balance right now.
              example: 5000
            covered_by_balance:
              type: boolean
              description: >-
                `true` if `current_balance_in_cents` covers
                `total_cost_in_cents`.
              example: true
            test_mode:
              type: boolean
              description: >-
                `true` if API Test Mode is on for your account. The estimate
                always quotes your real rates, while a send in test mode is not
                charged.
              example: false
            notes:
              type: array
              items:
                type: string
              description: >-
                Plain-language caveats about anything that could make the real
                charge differ, such as email-only recipients or a PDF whose
                pages could not be counted. Empty when there are none.
              example: []
    recipient-create-no-mailinglist:
      type: object
      anyOf:
        - title: Create Recipient by Address
          description: Create a recipient by providing address details
          required:
            - mailing_list_id
            - address
        - title: Create Recipient by Email
          description: Create a recipient by providing email address
          required:
            - mailing_list_id
            - email
      properties:
        name:
          type: string
          example: Tobias Example
        company:
          type: string
          example: www.thanks.io
        address:
          type: string
          example: 123 Main Street
        address2:
          type: string
          example: Apartment 1
        city:
          type: string
          example: Any Town
        province:
          type: string
          description: State or Province
          example: KS
        postal_code:
          type: string
          example: '12345'
        country:
          type: string
          example: US
        dob:
          type: string
          description: >-
            Date of Birth in ISO 8601 format (YYYY-MM-DD) or null if not set. If
            provided as MM/DD/YYYY in requests, it will be converted to ISO 8601
            format.
          example: '1981-04-23'
        anniversary:
          type: string
          description: >-
            Can be used for house purchase anniversaries, move-in dates, or any
            recurring annual milestone.  Anniversary date in ISO 8601 format
            (YYYY-MM-DD) or null if not set. If provided as MM/DD/YYYY in
            requests, it will be converted to ISO 8601 format.
          example: '2025-07-21'
        email:
          type: string
          example: tobias@example.com
        phone:
          type: string
          example: +1 (555) 123-4567
        custom1:
          type: string
          description: Custom field for additional information about the recipient
          example: Unique Info
        custom2:
          type: string
          description: Custom field for additional information about the recipient
          example: For example a product code or customer ID
        custom3:
          type: string
          description: Custom field for additional information about the recipient
          example: Any Extra Info
        custom4:
          type: string
          description: Custom field for additional information about the recipient
          example: Any Extra Info
        mailing-list:
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/mailing-list'
          description: The mailing list this recipient belongs to
        created_at:
          readOnly: true
          type: string
          example: '2025-06-27T14:57:11.000000Z'
        updated_at:
          readOnly: true
          type: string
          example: '2025-06-27T14:57:11.000000Z'
    mailing-list:
      type: object
      properties:
        id:
          type: integer
          example: 1
        user_id:
          type: integer
          example: 2
        sub_account_id:
          type:
            - integer
            - 'null'
        type:
          type: string
          example: manual
          enum:
            - csv
            - manual
            - map
            - friends
            - retarget
            - leads
            - zapier
            - radius
            - highlevel
            - qrscans
        description:
          type: string
          example: Test
        qrcode_url:
          type:
            - string
            - 'null'
        total_recipients:
          type: integer
          example: 1
        processed:
          type: boolean
          example: true
        is_suppression_list:
          type: boolean
          example: false
        total_scans:
          type: integer
          example: 0
        unique_scans:
          type: integer
          example: 0
        last_scan:
          type:
            - string
            - 'null'
        total_sends:
          type: integer
          example: 0
        last_send:
          type:
            - string
            - 'null'
        api_key:
          type: string
          description: >-
            API key that can be used to add recipients to this mailing list with
            thanks.io Webhooks
          example: abcd1234efgh5678ijkl9012mnop3456
        created_at:
          type: string
          example: '2018-07-15T06:06:57.000000Z'
          format: date-time
        created_at_diff:
          type: string
          example: 6 years ago
          description: Human-friendly relative time since creation
        updated_at:
          type: string
          example: '2025-06-27T14:57:11.000000Z'
          format: date-time
  responses:
    UserError:
      description: User error occurred
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Sub Account ID does not exist
    Unauthorized:
      description: Access token is missing or invalid
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Unauthorized
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Bearer token authentication using your thanks.io API key

````