{
"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"
}
Order Estimates
Estimate Postcard
Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.
POST
/
estimate
/
postcard
Estimate Postcard
const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: JSON.stringify({ size: '4x6', front_image_url: 'https://cdn.thanks.io/letter-backgrounds/bg0.png', message: 'Hey %FIRST_NAME%!,\n\nTHANK 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' } ] })};fetch('https://api.thanks.io/api/v2/estimate/postcard', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err));
curl --request POST \
--url https://api.thanks.io/api/v2/estimate/postcard \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"size": "4x6",
"front_image_url": "https://cdn.thanks.io/letter-backgrounds/bg0.png",
"message": "Hey %FIRST_NAME%!,\n\nTHANK 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"
}
]
}
'
import requests
url = "https://api.thanks.io/api/v2/estimate/postcard"
payload = {
"size": "4x6",
"front_image_url": "https://cdn.thanks.io/letter-backgrounds/bg0.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"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
{
"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"
}
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. On the Free and Business plans, preview images carry a DRAFT watermark; the mail you send never does. Professional and Enterprise previews have no watermark.
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.
Whether a recipient given an email but no street address has their postal address looked up from the email. Each address found is charged as an Email to Address lookup. Defaults to true. Set to false to skip the lookup: recipients without a street address are then left out of the order, which mails only the recipients that have one. Estimates never run the lookup and price such recipients as if found.
Postage class for this order. first_class mails First Class. standard mails Standard Mail (also known as Marketing Mail): lower cost for US addresses and slower to deliver, with no tracking status and no return-to-sender. Omit it to use your account's default, set with Standard Mail Mode under Settings > Mail Preferences. Standard Mail only changes the price of US addresses. Nonprofit accounts always mail at their nonprofit rate. standard needs a paid plan: free plan accounts always mail First Class, and standard from one is rejected with a 422.
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.
Recommended: send a saved creative instead of assembling image and message parameters per request. ID of a creative from your Creatives library (see List Creatives). The creative is sent exactly as saved: its image template, message template, handwriting and background all come from it. It cannot be combined with any parameter that changes those (image_template_id, message_template_id, front_image_url, message, the handwriting and custom background parameters, pdf_only_url, skip_creative_generation, or for gift cards giftcard_brand and giftcard_amount_in_cents); a request that does is rejected with a 422 naming them. Only qrcode_url and additional_pages_url can be added. The creative must belong to your account, be of the mailer type being sent (for postcards, the size being sent), and be complete (is_complete: true).
ID of image template to use for front of postcard. Use a template of the matching type: postcard for 4x6, postcard6x9 for 6x9, postcard6x11 for 6x11. A 6x9 send also accepts a postcard template. Required if front_image_url is not specified.
URL to image to use for front of postcard. Must be 1875px by 1275px for 4x6 postcards, 2738px by 1838px for 6x9 postcards, or 3337px by 1777px for 6x11 postcards. Required if image_template_id is not specified.
ID of message template to use for content on back of postcard. Use a template of the matching type: postcard for 4x6, postcard6x9 for 6x9, postcard6x11 for 6x11. A 6x9 send also accepts a postcard template.
URL to custom background image to use for back of postcard. This image will be placed behind the handwritten message. Must be 1875px by 1275px for 4x6 postcards, 2738px by 1838px for 6x9 postcards, or 3337px by 1777px for 6x11 postcards.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"thanks.io Direct Mail Automation Toolkit","colors":{"primary":"#4c1180","light":"#8e56f3","dark":"#6822c7"},"logo":{"light":"https://mintcdn.com/thanksio/jRViseKcOKEicv0x/logo/light.svg?fit=max\u0026auto=format\u0026n=jRViseKcOKEicv0x\u0026q=85\u0026s=a63121814f9dc669a8d9dd480d2ed672","dark":"https://mintcdn.com/thanksio/jRViseKcOKEicv0x/logo/dark.svg?fit=max\u0026auto=format\u0026n=jRViseKcOKEicv0x\u0026q=85\u0026s=e0e960050738128dafc05dcb4aee7a69"},"favicon":"https://mintcdn.com/thanksio/jRViseKcOKEicv0x/favicon.svg?fit=max\u0026auto=format\u0026n=jRViseKcOKEicv0x\u0026q=85\u0026s=aecbb51507c67d60ae8911184b6d9fa0","api":{"playground":{"display":"interactive"},"examples":{"languages":["javascript","curl","python"]}},"appearance":{"default":"light","strict":true},"navbar":{"links":[{"icon":"headset","href":"https://calendly.com/thanks-io/","label":"Schedule API Consult"},{"icon":"gauge","href":"https://dashboard.thanks.io","label":"Dashboard"}],"primary":{"type":"button","label":"Create Free Account w/ $10 in Credits","href":"https://dashboard.thanks.io/register?signup_source=api_docs"}},"footer":{"socials":{"facebook":"https://www.facebook.com/groups/thanksio","github":"https://github.com/thanks-io","linkedin":"https://www.linkedin.com/company/11209125","youtube":"https://www.youtube.com/c/thanksio","x":"https://twitter.com/thanks_io_","instagram":"https://www.instagram.com/thanks.io"},"links":[{"header":"Resources","items":[{"label":"Help Docs","href":"https://help.thanks.io"},{"label":"Schedule API Consult","href":"https://calendly.com/thanks-io"},{"label":"Postman","href":"https://postman.thanks.io"}]},{"header":"Company","items":[{"label":"Website","href":"https://thanks.io"},{"label":"Contact","href":"mailto:support@thanks.io"}]}]},"integrations":{"posthog":{"apiKey":"phc_x9vVXcHH4npVKd6yxRGdCcSSLkfQ7hUYzDyhdhXrA6Uj","apiHost":"https://us.i.posthog.com"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"thanksio","hasAudioNarration":false,"actualSubdomain":"thanksio","customDomains":["docs.thanks.io"],"gitSource":{"type":"github","owner":"thanks-io","repo":"thanks.io-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{},"buildId":"6af52e483d3498e3b9ae2baa","clientVersion":"0.0.4117","searchFilterCounts":[{"language":"default","tag":"API Reference","count":73},{"language":"default","tag":"API Endpoints","count":61},{"language":"default","tag":"Design Gallery","count":46},{"language":"default","tag":"Inspirations","count":38},{"language":"default","tag":"Postcards","count":35},{"language":"default","tag":"Native Integrations","count":17},{"language":"default","tag":"Get Started","count":13},{"language":"default","tag":"Account","count":12},{"language":"default","tag":"Guides","count":11},{"language":"default","tag":"General Integrations","count":9}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/endpoint/estimate/estimate-postcard","slug":"/api-reference/endpoint/estimate/estimate-postcard","pageMetadata":{"openapi":"post /estimate/postcard","title":"Estimate Postcard","description":"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: nothing is charged, nothing is printed or mailed, and no order is created.\n\nThe 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.","href":"/api-reference/endpoint/estimate/estimate-postcard"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: nothing is charged, nothing is printed or mailed, and no order is created.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"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 \", _jsx(_components.code, {\n children: \"pending_email_lookups\"\n }), \". A \", _jsx(_components.code, {\n children: \"radius_search\"\n }), \" is counted and priced, but no records are purchased.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"post /estimate/postcard","title":"Estimate Postcard","description":"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: nothing is charged, nothing is printed or mailed, and no order is created.\n\nThe 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.","href":"/api-reference/endpoint/estimate/estimate-postcard"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Order Estimates"],"summary":"Estimate Postcard","description":"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: nothing is charged, nothing is printed or mailed, and no order is created.\n\nThe 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":"a227e288-31cc-4436-ab22-278436a2aa21","responses":{"200":"861adf8f-586e-4a89-9635-fc5a66eb2db5","400":"e7ac7525-631b-4d58-8343-c855fdaa1ac9","401":"74c323de-f094-4748-a727-67f823796006","402":"96c7d2fa-f777-4a6c-a964-7c218f3edd72","422":"ec52be14-7e8b-4dc3-9154-bd8d2a739642"},"method":"post","type":"path","servers":["707b46ab-cdbf-4d64-b507-a18ba0668278"],"security":["a8bec680-428c-4b45-8ecd-d3fba3e2f21a"],"path":"/estimate/postcard","baseUrlOptions":["https://api.thanks.io/api/v2"],"title":"Estimate Postcard","codeSamples":[],"requestExampleLanguages":["javascript","bash","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"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. On the Free and Business plans, preview images carry a DRAFT watermark; the mail you send never does. Professional and Enterprise previews have no watermark.","example":true,"uniqueKey":"preview","typeLabel":"boolean"},"mailing_list_ids":{"type":"array","description":"Mailing list IDs to send to. Required if `recipients` and `radius_search` are not provided.","items":{"type":"integer","uniqueKey":"mailing_list_ids.items.[INDEX]","typeLabel":"integer"},"example":[5166,514],"uniqueKey":"mailing_list_ids","typeLabel":"integer[]"},"recipients":{"type":"array","description":"Recipients to send to. Required if `mailing_list_ids` and `radius_search` are not provided.","items":{"oneOf":[{"type":"object","title":"Create Recipient by Address","description":"Create a recipient by providing address details","required":["mailing_list_id","address"],"properties":{"address":{"type":"string","example":"123 Main Street","isRequired":true,"uniqueKey":"recipients.items.[INDEX].oneOf.0.address","typeLabel":"string"},"name":{"type":"string","example":"Tobias Example","uniqueKey":"recipients.items.[INDEX].oneOf.0.name","typeLabel":"string"},"company":{"type":"string","example":"thanks.io","uniqueKey":"recipients.items.[INDEX].oneOf.0.company","typeLabel":"string"},"address2":{"type":"string","example":"Apartment 1","uniqueKey":"recipients.items.[INDEX].oneOf.0.address2","typeLabel":"string"},"city":{"type":"string","example":"Any Town","uniqueKey":"recipients.items.[INDEX].oneOf.0.city","typeLabel":"string"},"province":{"type":"string","description":"State or Province","example":"KS","uniqueKey":"recipients.items.[INDEX].oneOf.0.province","typeLabel":"string"},"postal_code":{"type":"string","example":"12345","uniqueKey":"recipients.items.[INDEX].oneOf.0.postal_code","typeLabel":"string"},"country":{"type":"string","example":"US","uniqueKey":"recipients.items.[INDEX].oneOf.0.country","typeLabel":"string"},"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","uniqueKey":"recipients.items.[INDEX].oneOf.0.dob","typeLabel":"string"},"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","uniqueKey":"recipients.items.[INDEX].oneOf.0.anniversary","typeLabel":"string"},"email":{"type":"string","example":"tobias@example.com","uniqueKey":"recipients.items.[INDEX].oneOf.0.email","typeLabel":"string"},"phone":{"type":"string","example":"+1 (555) 123-4567","uniqueKey":"recipients.items.[INDEX].oneOf.0.phone","typeLabel":"string"},"custom1":{"type":"string","description":"Custom field for additional information about the recipient","example":"Unique Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom1","typeLabel":"string"},"custom2":{"type":"string","description":"Custom field for additional information about the recipient","example":"For example a product code or customer ID","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom2","typeLabel":"string"},"custom3":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom3","typeLabel":"string"},"custom4":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom4","typeLabel":"string"},"custom5":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom5","typeLabel":"string"},"custom6":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom6","typeLabel":"string"},"custom7":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom7","typeLabel":"string"},"custom8":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom8","typeLabel":"string"},"custom9":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom9","typeLabel":"string"},"custom10":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.0.custom10","typeLabel":"string"},"absentee_address":{"type":"string","description":"The property (absentee) address for this recipient, such as a house an absentee owner owns, as opposed to where they get mail. Give either the whole address here, or the street line here with `absentee_city`, `absentee_province` and `absentee_postal_code`. When set, the `~ABSENTEE_STREET~`, `~ABSENTEE_FULL_ADDRESS~`, `~FULL_ADDRESS~` and `~STREET_VIEW~` image template variables, and `%ABSENTEE_STREET%` in messages, use this address instead of the mailing address. The mailer is still delivered to `address`. Include the city, state and ZIP so Street View finds the right property. It is stored and returned in its own `absentee_address` field, and also copied into `custom2` when that is empty, so templates that print `%CUSTOM2%` keep working; a `custom2` you send is never changed. The older convention of `custom1` = `absentee` with `custom2` = the property address is still accepted and copied into `absentee_address`.","example":"742 Evergreen Terrace","uniqueKey":"recipients.items.[INDEX].oneOf.0.absentee_address","typeLabel":"string"},"absentee_city":{"type":"string","description":"City of the absentee (property) address. Requires `absentee_address` in the same request.","example":"Springfield","uniqueKey":"recipients.items.[INDEX].oneOf.0.absentee_city","typeLabel":"string"},"absentee_province":{"type":"string","description":"State or province of the absentee (property) address. Requires `absentee_address` in the same request.","example":"IL","uniqueKey":"recipients.items.[INDEX].oneOf.0.absentee_province","typeLabel":"string"},"absentee_postal_code":{"type":"string","description":"ZIP or postal code of the absentee (property) address. Requires `absentee_address` in the same request.","example":"62704","uniqueKey":"recipients.items.[INDEX].oneOf.0.absentee_postal_code","typeLabel":"string"}},"uniqueKey":"recipients.items.[INDEX].oneOf.0","typeLabel":"Create Recipient by Address · object"},{"type":"object","title":"Create Recipient by Email","description":"Create a recipient by providing email address","required":["mailing_list_id","email"],"properties":{"email":{"type":"string","example":"tobias@example.com","isRequired":true,"uniqueKey":"recipients.items.[INDEX].oneOf.1.email","typeLabel":"string"},"name":{"type":"string","example":"Tobias Example","uniqueKey":"recipients.items.[INDEX].oneOf.1.name","typeLabel":"string"},"company":{"type":"string","example":"thanks.io","uniqueKey":"recipients.items.[INDEX].oneOf.1.company","typeLabel":"string"},"address":{"type":"string","example":"123 Main Street","uniqueKey":"recipients.items.[INDEX].oneOf.1.address","typeLabel":"string"},"address2":{"type":"string","example":"Apartment 1","uniqueKey":"recipients.items.[INDEX].oneOf.1.address2","typeLabel":"string"},"city":{"type":"string","example":"Any Town","uniqueKey":"recipients.items.[INDEX].oneOf.1.city","typeLabel":"string"},"province":{"type":"string","description":"State or Province","example":"KS","uniqueKey":"recipients.items.[INDEX].oneOf.1.province","typeLabel":"string"},"postal_code":{"type":"string","example":"12345","uniqueKey":"recipients.items.[INDEX].oneOf.1.postal_code","typeLabel":"string"},"country":{"type":"string","example":"US","uniqueKey":"recipients.items.[INDEX].oneOf.1.country","typeLabel":"string"},"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","uniqueKey":"recipients.items.[INDEX].oneOf.1.dob","typeLabel":"string"},"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","uniqueKey":"recipients.items.[INDEX].oneOf.1.anniversary","typeLabel":"string"},"phone":{"type":"string","example":"+1 (555) 123-4567","uniqueKey":"recipients.items.[INDEX].oneOf.1.phone","typeLabel":"string"},"custom1":{"type":"string","description":"Custom field for additional information about the recipient","example":"Unique Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom1","typeLabel":"string"},"custom2":{"type":"string","description":"Custom field for additional information about the recipient","example":"For example a product code or customer ID","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom2","typeLabel":"string"},"custom3":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom3","typeLabel":"string"},"custom4":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom4","typeLabel":"string"},"custom5":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom5","typeLabel":"string"},"custom6":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom6","typeLabel":"string"},"custom7":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom7","typeLabel":"string"},"custom8":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom8","typeLabel":"string"},"custom9":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom9","typeLabel":"string"},"custom10":{"type":"string","description":"Custom field for additional information about the recipient","example":"Any Extra Info","uniqueKey":"recipients.items.[INDEX].oneOf.1.custom10","typeLabel":"string"},"absentee_address":{"type":"string","description":"The property (absentee) address for this recipient, such as a house an absentee owner owns, as opposed to where they get mail. Give either the whole address here, or the street line here with `absentee_city`, `absentee_province` and `absentee_postal_code`. When set, the `~ABSENTEE_STREET~`, `~ABSENTEE_FULL_ADDRESS~`, `~FULL_ADDRESS~` and `~STREET_VIEW~` image template variables, and `%ABSENTEE_STREET%` in messages, use this address instead of the mailing address. The mailer is still delivered to `address`. Include the city, state and ZIP so Street View finds the right property. It is stored and returned in its own `absentee_address` field, and also copied into `custom2` when that is empty, so templates that print `%CUSTOM2%` keep working; a `custom2` you send is never changed. The older convention of `custom1` = `absentee` with `custom2` = the property address is still accepted and copied into `absentee_address`.","example":"742 Evergreen Terrace","uniqueKey":"recipients.items.[INDEX].oneOf.1.absentee_address","typeLabel":"string"},"absentee_city":{"type":"string","description":"City of the absentee (property) address. Requires `absentee_address` in the same request.","example":"Springfield","uniqueKey":"recipients.items.[INDEX].oneOf.1.absentee_city","typeLabel":"string"},"absentee_province":{"type":"string","description":"State or province of the absentee (property) address. Requires `absentee_address` in the same request.","example":"IL","uniqueKey":"recipients.items.[INDEX].oneOf.1.absentee_province","typeLabel":"string"},"absentee_postal_code":{"type":"string","description":"ZIP or postal code of the absentee (property) address. Requires `absentee_address` in the same request.","example":"62704","uniqueKey":"recipients.items.[INDEX].oneOf.1.absentee_postal_code","typeLabel":"string"}},"uniqueKey":"recipients.items.[INDEX].oneOf.1","typeLabel":"Create Recipient by Email · object"}],"uniqueKey":"recipients.items.[INDEX]","typeLabel":"Create Recipient by Address · object | Create Recipient by Email · object"},"uniqueKey":"recipients","typeLabel":"(Create Recipient by Address · object | Create Recipient by Email · object)[]"},"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,"uniqueKey":"radius_search.preview","typeLabel":"boolean"},"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.","uniqueKey":"radius_search.address","typeLabel":"string"},"record_count":{"type":"integer","description":"Number of nearby records to return.","minimum":1,"maximum":10000,"example":1,"uniqueKey":"radius_search.record_count","typeLabel":"integer"},"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","uniqueKey":"radius_search.record_types","typeLabel":"enum\u003cstring>"},"include_condos":{"type":"boolean","description":"Include condos in search.","default":false,"uniqueKey":"radius_search.include_condos","typeLabel":"boolean"},"append_data":{"type":"boolean","description":"Append phone and email to each record for an additional fee ($.20 per record).","default":false,"uniqueKey":"radius_search.append_data","typeLabel":"boolean"},"use_property_owner":{"type":"boolean","description":"Use the property owner's address when searching commercial records.","default":false,"uniqueKey":"radius_search.use_property_owner","typeLabel":"boolean"},"include_search_address":{"type":"boolean","description":"Set to true to include the search address in the generated mailing list.","uniqueKey":"radius_search.include_search_address","typeLabel":"boolean"}},"uniqueKey":"radius_search","typeLabel":"object"},"handwriting_style_id":{"type":"integer","description":"ID of handwriting style to use.","example":4,"uniqueKey":"handwriting_style_id","typeLabel":"integer"},"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"],"uniqueKey":"handwriting_color","typeLabel":"enum\u003cstring>"},"handwriting_realism":{"type":"boolean","description":"Set to true to enable the realism effect for AI fonts.","example":true,"uniqueKey":"handwriting_realism","typeLabel":"boolean"},"sub_account":{"type":"integer","description":"Sub-account ID to use for this order.","example":7,"uniqueKey":"sub_account","typeLabel":"integer"},"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","uniqueKey":"notification_emails","typeLabel":"string"},"email_lookup":{"type":"boolean","description":"Whether a recipient given an `email` but no street address has their postal address looked up from the email. Each address found is charged as an Email to Address lookup. Defaults to `true`. Set to `false` to skip the lookup: recipients without a street address are then left out of the order, which mails only the recipients that have one. Estimates never run the lookup and price such recipients as if found.","default":true,"example":false,"uniqueKey":"email_lookup","typeLabel":"boolean"},"postage_class":{"type":"string","description":"Postage class for this order. `first_class` mails First Class. `standard` mails Standard Mail (also known as Marketing Mail): lower cost for US addresses and slower to deliver, with no tracking status and no return-to-sender. Omit it to use your account's default, set with Standard Mail Mode under Settings > Mail Preferences. Standard Mail only changes the price of US addresses. Nonprofit accounts always mail at their nonprofit rate. `standard` needs a paid plan: free plan accounts always mail First Class, and `standard` from one is rejected with a 422.","enum":["first_class","standard"],"example":"standard","uniqueKey":"postage_class","typeLabel":"enum\u003cstring>"},"return_name":{"type":"string","description":"Custom return name for the order.","example":"Custom Return","uniqueKey":"return_name","typeLabel":"string"},"return_address":{"type":"string","description":"Custom return address for the order.","example":"1 Main Street","uniqueKey":"return_address","typeLabel":"string"},"return_address2":{"type":"string","description":"Custom return address line 2 for the order.","example":"Unit 1","uniqueKey":"return_address2","typeLabel":"string"},"return_city":{"type":"string","description":"Custom return city for the order.","example":"Woodbridge","uniqueKey":"return_city","typeLabel":"string"},"return_state":{"type":"string","description":"Custom return state/province for the order.","example":"NJ","uniqueKey":"return_state","typeLabel":"string"},"return_postal_code":{"type":"string","description":"Custom return postal code for the order.","example":"07095","uniqueKey":"return_postal_code","typeLabel":"string"},"metadata":{"oneOf":[{"type":"object","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"},"uniqueKey":"metadata.oneOf.0","typeLabel":"object"},{"type":"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"},"uniqueKey":"metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata","typeLabel":"object | null"},"creative_id":{"type":"integer","description":"Recommended: send a saved creative instead of assembling image and message parameters per request. ID of a creative from your Creatives library (see List Creatives). The creative is sent exactly as saved: its image template, message template, handwriting and background all come from it. It cannot be combined with any parameter that changes those (image_template_id, message_template_id, front_image_url, message, the handwriting and custom background parameters, pdf_only_url, skip_creative_generation, or for gift cards giftcard_brand and giftcard_amount_in_cents); a request that does is rejected with a 422 naming them. Only qrcode_url and additional_pages_url can be added. The creative must belong to your account, be of the mailer type being sent (for postcards, the size being sent), and be complete (`is_complete: true`).","example":501,"uniqueKey":"creative_id","typeLabel":"integer"},"image_template_id":{"type":"integer","description":"ID of image template to use for front of postcard. Use a template of the matching type: `postcard` for 4x6, `postcard6x9` for 6x9, `postcard6x11` for 6x11. A 6x9 send also accepts a `postcard` template. Required if front_image_url is not specified.","example":6,"uniqueKey":"image_template_id","typeLabel":"integer"},"front_image_url":{"type":"string","description":"URL to image to use for front of postcard. Must be 1875px by 1275px for 4x6 postcards, 2738px by 1838px for 6x9 postcards, or 3337px by 1777px for 6x11 postcards. Required if image_template_id is not specified.","example":"https://cdn.thanks.io/letter-backgrounds/bg0.png","uniqueKey":"front_image_url","typeLabel":"string"},"message":{"type":"string","description":"Handwritten message content used for content on back of postcard.","example":"Hey %FIRST_NAME%!,\n\nTHANK YOU for allowing us the opportunity to HELP you with your plan!","uniqueKey":"message","typeLabel":"string"},"message_template_id":{"type":"integer","description":"ID of message template to use for content on back of postcard. Use a template of the matching type: `postcard` for 4x6, `postcard6x9` for 6x9, `postcard6x11` for 6x11. A 6x9 send also accepts a `postcard` template.","example":12,"uniqueKey":"message_template_id","typeLabel":"integer"},"use_custom_background":{"type":"boolean","description":"Use custom background image. This can be used to turn off the default background image.","default":false,"uniqueKey":"use_custom_background","typeLabel":"boolean"},"custom_background_image":{"type":"string","description":"URL to custom background image to use for back of postcard. This image will be placed behind the handwritten message. Must be 1875px by 1275px for 4x6 postcards, 2738px by 1838px for 6x9 postcards, or 3337px by 1777px for 6x11 postcards.","example":"https://cdn.thanks.io/letter-backgrounds/bg0.png","uniqueKey":"custom_background_image","typeLabel":"string"},"qrcode_url":{"type":"string","description":"URL to Autogenerate QR Code on back of postcard. If not specified, account default QR code URL will be used.","example":"https://www.google.com","uniqueKey":"qrcode_url","typeLabel":"string"},"size":{"type":"string","description":"Size of the postcard. A 6x9 postcard is placed as a `postcard6x9` order and a 6x11 postcard as a `postcard6x11` order.","default":"4x6","enum":["4x6","6x9","6x11"],"uniqueKey":"size","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"4x6 w/ Image URL/Recipients":{"title":"4x6 w/ Image URL/Recipients","description":"Example of sending a 4x6 postcard using a custom front image URL, handwritten message, and an array of recipients with custom fields.","value":{"size":"4x6","front_image_url":"https://cdn.thanks.io/letter-backgrounds/bg0.png","message":"Hey %FIRST_NAME%!,\n\nTHANK 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"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"861adf8f-586e-4a89-9635-fc5a66eb2db5":{"description":"The order was priced. Nothing was charged and no order was created.","content":{"application/json":{"schema":{"type":"object","title":"Estimate Response","properties":{"message":{"type":"string","example":"OK","uniqueKey":"message","typeLabel":"string"},"data":{"type":"object","properties":{"type":{"type":"string","description":"Mailer type that was priced. A 6x9 postcard is reported as `postcard6x9` and a 6x11 postcard as `postcard6x11`; `postcard` means 4x6.","enum":["postcard","postcard6x9","postcard6x11","letter","windowlessletter","notecard","magnacard","giftcard"],"example":"postcard","uniqueKey":"data.type","typeLabel":"enum\u003cstring>"},"size":{"oneOf":[{"type":"string","description":"Postcard size that was priced. `null` for other mailer types.","example":"4x6","uniqueKey":"data.size.oneOf.0","typeLabel":"string"},{"type":"null","description":"Postcard size that was priced. `null` for other mailer types.","example":"4x6","uniqueKey":"data.size.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.size","typeLabel":"string | null"},"total_recipients":{"type":"integer","description":"Number of pieces the order would mail.","example":2,"uniqueKey":"data.total_recipients","typeLabel":"integer"},"recipients":{"type":"object","description":"`total_recipients` split by destination.","properties":{"united_states":{"type":"integer","example":2,"uniqueKey":"data.recipients.united_states","typeLabel":"integer"},"international":{"type":"integer","example":0,"uniqueKey":"data.recipients.international","typeLabel":"integer"}},"uniqueKey":"data.recipients","typeLabel":"object"},"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,"uniqueKey":"data.pending_email_lookups","typeLabel":"integer"},"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,"uniqueKey":"data.costs_in_cents.united_states","typeLabel":"integer"},"international":{"type":"integer","description":"Printing and postage for international pieces.","example":0,"uniqueKey":"data.costs_in_cents.international","typeLabel":"integer"},"additional_pages":{"type":"integer","description":"Additional letter pages, priced per page. `0` for other mailer types.","example":0,"uniqueKey":"data.costs_in_cents.additional_pages","typeLabel":"integer"},"giftcard_face_value":{"type":"integer","description":"Combined face value of every gift card in the order. `0` for other mailer types.","example":0,"uniqueKey":"data.costs_in_cents.giftcard_face_value","typeLabel":"integer"},"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,"uniqueKey":"data.costs_in_cents.grand_total","typeLabel":"integer"}},"uniqueKey":"data.costs_in_cents","typeLabel":"object"},"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,"uniqueKey":"data.total_cost_in_cents","typeLabel":"integer"},"total_cost":{"type":"string","description":"`total_cost_in_cents` formatted in dollars.","example":"$2.36","uniqueKey":"data.total_cost","typeLabel":"string"},"current_balance_in_cents":{"type":"integer","description":"Your account's credit balance right now.","example":5000,"uniqueKey":"data.current_balance_in_cents","typeLabel":"integer"},"covered_by_balance":{"type":"boolean","description":"`true` if `current_balance_in_cents` covers `total_cost_in_cents`.","example":true,"uniqueKey":"data.covered_by_balance","typeLabel":"boolean"},"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,"uniqueKey":"data.test_mode","typeLabel":"boolean"},"notes":{"type":"array","items":{"type":"string","uniqueKey":"data.notes.items.[INDEX]","typeLabel":"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":[],"uniqueKey":"data.notes","typeLabel":"string[]"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Estimate Response · object"},"example":{"message":"OK","data":{"type":"postcard","size":"4x6","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":[]}},"examples":{"Example":{"title":"Example","value":{"message":"OK","data":{"type":"postcard","size":"4x6","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":[]}}}},"exampleType":"examples"}},"exampleType":"examples"},"e7ac7525-631b-4d58-8343-c855fdaa1ac9":{"description":"User error occurred","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Sub Account ID does not exist","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"Sub Account ID does not exist"}}},"exampleType":"generated"}},"exampleType":"generated"},"74c323de-f094-4748-a727-67f823796006":{"description":"Access token is missing or invalid","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Unauthorized","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"Unauthorized"}}},"exampleType":"generated"}},"exampleType":"generated"},"96c7d2fa-f777-4a6c-a964-7c218f3edd72":{"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"},"examples":{"Example":{"title":"Example","value":{"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"}}},"exampleType":"examples"}},"exampleType":"examples"},"ec52be14-7e8b-4dc3-9154-bd8d2a739642":{"description":"Validation failed on the request body, exactly as it would on the matching send.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"a8bec680-428c-4b45-8ecd-d3fba3e2f21a":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Bearer token authentication using your thanks.io API key","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"707b46ab-cdbf-4d64-b507-a18ba0668278":{"url":"https://api.thanks.io/api/v2","description":"The main API server for thanks.io"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Bearer token authentication using your thanks.io API key","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer token authentication using your thanks.io API key","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"thanksio","siteName":"thanks.io Direct Mail Automation Toolkit","title":"Estimate Postcard - thanks.io Direct Mail Automation Toolkit","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-28T03:06:25.369Z","originalFileLocation":"api-reference/endpoint/estimate/estimate-postcard.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.\">\u003cmeta data-mint-head name=\"application-name\" content=\"thanks.io Direct Mail Automation Toolkit\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Estimate Postcard - thanks.io Direct Mail Automation Toolkit\">\u003cmeta data-mint-head property=\"og:description\" content=\"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"thanks.io Direct Mail Automation Toolkit\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://thanksio.mintlify.site/_mintlify/api/og/v2?division=Order+Estimates\u0026amp;title=Estimate+Postcard\u0026amp;description=Price+a+postcard+order+without+placing+it.+Send+the+same+request+body+you+would+send+to+Send+Postcard%3A+nothing+is+charged%2C+nothing+is+printed+or+mailed%2C+and+no+\u0026amp;theme=1264b6494f3fd6a53e585726\u0026amp;signature=b0600a8a144a36250964fdaab4b07084417e577fe778e5e9effb157aea97bbc8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Estimate Postcard - thanks.io Direct Mail Automation Toolkit\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://thanksio.mintlify.site/_mintlify/api/og/v2?division=Order+Estimates\u0026amp;title=Estimate+Postcard\u0026amp;description=Price+a+postcard+order+without+placing+it.+Send+the+same+request+body+you+would+send+to+Send+Postcard%3A+nothing+is+charged%2C+nothing+is+printed+or+mailed%2C+and+no+\u0026amp;theme=1264b6494f3fd6a53e585726\u0026amp;signature=b0600a8a144a36250964fdaab4b07084417e577fe778e5e9effb157aea97bbc8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/thanksio/4A9jZiRamFPkvvwd/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"thanks.io Direct Mail Automation Toolkit\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4c1180\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoint/estimate/estimate-postcard.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.thanks.io/#organization\",\"name\":\"thanks.io Direct Mail Automation Toolkit\",\"url\":\"https://docs.thanks.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/thanksio/jRViseKcOKEicv0x/logo/light.svg?fit=max\u0026auto=format\u0026n=jRViseKcOKEicv0x\u0026q=85\u0026s=a63121814f9dc669a8d9dd480d2ed672\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.thanks.io#website\",\"name\":\"thanks.io Direct Mail Automation Toolkit\",\"url\":\"https://docs.thanks.io\",\"publisher\":{\"@id\":\"https://docs.thanks.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard#webpage\",\"url\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard\",\"name\":\"Estimate Postcard\",\"description\":\"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.\",\"dateModified\":\"2026-09-28T03:06:25.369Z\",\"isPartOf\":{\"@id\":\"https://docs.thanks.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Endpoints\",\"item\":\"https://docs.thanks.io/api-reference/recipients-usage\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Estimate Postcard\",\"item\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard#apireference\",\"headline\":\"Estimate Postcard\",\"name\":\"Estimate Postcard\",\"description\":\"Price a postcard order without placing it. Send the same request body you would send to Send Postcard: 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.\",\"url\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard\",\"mainEntityOfPage\":{\"@id\":\"https://docs.thanks.io/api-reference/endpoint/estimate/estimate-postcard#webpage\"},\"dateModified\":\"2026-09-28T03:06:25.369Z\",\"publisher\":{\"@id\":\"https://docs.thanks.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.thanks.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"thanks.io Direct Mail Automation Toolkit\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"thanks.io Direct Mail Automation Toolkit\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/endpoint/estimate/estimate-postcard.md","siteName":"thanks.io Direct Mail Automation Toolkit","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"Design Gallery","pages":[{"title":"Design Gallery","href":"/design-gallery/introduction"}]},{"tab":"API Reference","groups":[{"group":"Get Started","icon":"play","pages":[{"title":"REST API Overview","href":"/api-reference/introduction"},{"title":"API Testing Mode","mode":"wide","href":"/api-reference/api-mode"},{"title":"API Log","href":"/api-reference/audit-log"},{"title":"Rate Limits","mode":"wide","href":"/api-reference/rate-limits"},{"title":"OpenAPI Specification","href":"/api-reference/openapi-link"}]},{"group":"Authentication","icon":"lock","pages":[{"title":"Choosing an Authentication Method","href":"/authentication/choosing-auth-method"},{"title":"Bearer Token","href":"/authentication/bearer-token"},{"title":"OAuth","href":"/authentication/oauth"}]},{"group":"API Endpoints","icon":"code","pages":[{"group":"Recipients","icon":"user","pages":[{"title":"Usage","href":"/api-reference/recipients-usage"},{"openapi":"post /recipients","title":"Create Recipient","href":"/api-reference/endpoint/recipients/create-recipient"},{"openapi":"get /recipients/{recipientId}","title":"Recipient Details","href":"/api-reference/endpoint/recipients/get-details"},{"openapi":"put /recipients/{recipientId}","title":"Update Recipient","href":"/api-reference/endpoint/recipients/update-recipient"},{"openapi":"delete /recipients/{recipientId}","title":"Delete Recipient","href":"/api-reference/endpoint/recipients/delete-recipient"},{"openapi":"post /recipients-utils/create-multiple","title":"Create Multiple Recipients","href":"/api-reference/endpoint/recipients/create-multiple-recipients"},{"openapi":"post /recipients-utils/delete-by-address","title":"Delete Recipient By Address","href":"/api-reference/endpoint/recipients/delete-recipient-by-address"}]},{"group":"Mailing Lists","icon":"list","pages":[{"title":"Usage","href":"/api-reference/mailing-lists-usage"},{"openapi":"get /mailing-lists/","title":"List All","href":"/api-reference/endpoint/mailing-lists/list-all"},{"openapi":"post /mailing-lists/","title":"Create Mailing List","href":"/api-reference/endpoint/mailing-lists/create-mailing-list"},{"openapi":"get /mailing-lists/{mailingListId}","title":"Get Details","href":"/api-reference/endpoint/mailing-lists/get-details"},{"openapi":"delete /mailing-lists/{mailingListId}","title":"Delete Mailing List","href":"/api-reference/endpoint/mailing-lists/delete-mailing-list"},{"openapi":"get /mailing-lists-utils/recipients/{mailingListId}","title":"List Recipients","href":"/api-reference/endpoint/mailing-lists/list-recipients"},{"openapi":"post /mailing-lists-utils/count-radius-search","title":"Radius Search Count","href":"/api-reference/endpoint/mailing-lists/radius-search-count"},{"openapi":"post /mailing-lists-utils/buy-radius-search","title":"Radius Search","href":"/api-reference/endpoint/mailing-lists/radius-search"}]},{"group":"Direct Send Orders","icon":"envelope","pages":[{"title":"Usage","href":"/api-reference/send-mailer-usage"},{"openapi":"post /send/postcard","title":"Send Postcard","href":"/api-reference/endpoint/send-mailer/send-postcard"},{"openapi":"post /send/windowedletter","title":"Send Windowed Letter","href":"/api-reference/endpoint/send-mailer/send-windowed-letter"},{"openapi":"post /send/windowlessletter","title":"Send Windowless Letter","href":"/api-reference/endpoint/send-mailer/send-windowless-letter"},{"openapi":"post /send/notecard","title":"Send Notecard","href":"/api-reference/endpoint/send-mailer/send-notecard"},{"openapi":"post /send/giftcard","title":"Send Giftcard","href":"/api-reference/endpoint/send-mailer/send-giftcard"},{"openapi":"post /send/magnacard","title":"Send Magnacard","description":"Send a Magnacard.","href":"/api-reference/endpoint/send-mailer/send-magnacard"}]},{"group":"Order Estimates","icon":"calculator","pages":[{"openapi":"post /estimate/postcard","title":"Estimate Postcard","href":"/api-reference/endpoint/estimate/estimate-postcard"},{"openapi":"post /estimate/windowedletter","title":"Estimate Windowed Letter","description":"Price a windowed letter order without placing it. Send the same request body you would send to Send Windowed Letter: nothing is charged, nothing is printed or mailed, and no order is created.\n\nThe 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.","href":"/api-reference/endpoint/estimate/estimate-windowed-letter"},{"openapi":"post /estimate/windowlessletter","title":"Estimate Windowless Letter","href":"/api-reference/endpoint/estimate/estimate-windowless-letter"},{"openapi":"post /estimate/notecard","title":"Estimate Notecard","href":"/api-reference/endpoint/estimate/estimate-notecard"},{"openapi":"post /estimate/giftcard","title":"Estimate Giftcard","href":"/api-reference/endpoint/estimate/estimate-giftcard"},{"openapi":"post /estimate/magnacard","title":"Estimate Magnacard","href":"/api-reference/endpoint/estimate/estimate-magnacard"}]},{"group":"Creatives Library","icon":"palette","pages":[{"title":"Usage","href":"/api-reference/creatives-library-usage"},{"openapi":"get /creatives/","title":"List Creatives","href":"/api-reference/endpoint/creatives-library/list-all-creatives"},{"openapi":"get /creatives/{creativeId}","title":"Get Creative","href":"/api-reference/endpoint/creatives-library/get-creative"}]},{"group":"Message Templates","icon":"message","pages":[{"title":"Usage","href":"/api-reference/message-templates-usage"},{"openapi":"get /message-templates/","title":"List Message Templates","href":"/api-reference/endpoint/message-templates/list-all-message-templates"},{"openapi":"post /message-templates/","title":"Create Message Template","href":"/api-reference/endpoint/message-templates/create-message-template"},{"openapi":"get /message-templates/{messageTemplateId}","title":"Get Message Template","href":"/api-reference/endpoint/message-templates/get-message-template"},{"openapi":"patch /message-templates/{messageTemplateId}","title":"Update Message Template","href":"/api-reference/endpoint/message-templates/update-message-template"},{"openapi":"delete /message-templates/{messageTemplateId}","title":"Delete Message Template","href":"/api-reference/endpoint/message-templates/delete-message-template"}]},{"group":"Account","icon":"gear","pages":[{"openapi":"post /sub-accounts/","title":"Create Sub-Account","href":"/api-reference/endpoint/sub-accounts/create-sub-account"},{"openapi":"get /sub-accounts/{subAccountId}","title":"Show Sub-Account","href":"/api-reference/endpoint/sub-accounts/get-details"},{"openapi":"put /sub-accounts/{subAccountId}","title":"Update Sub-Account","href":"/api-reference/endpoint/sub-accounts/update-sub-account"},{"openapi":"delete /sub-accounts/{subAccountId}","title":"Delete Sub-Account","href":"/api-reference/endpoint/sub-accounts/delete-sub-account"},{"openapi":"get /sub-accounts/","title":"List Sub-Accounts","href":"/api-reference/endpoint/sub-accounts/list-all"},{"openapi":"get /image-templates/","title":"List Image Templates","href":"/api-reference/endpoint/image-templates/list-all-image-templates"},{"openapi":"get /orders/list","title":"List Orders","href":"/api-reference/endpoint/orders/list-orders"},{"openapi":"get /orders/{orderId}/track","title":"Track Order","href":"/api-reference/endpoint/orders/track-order"},{"openapi":"get /orders/{orderId}/items","title":"List Order Items","href":"/api-reference/endpoint/orders/list-order-items"},{"openapi":"put /orders/{orderId}/cancel","title":"Cancel Order","href":"/api-reference/endpoint/orders/cancel-order"},{"openapi":"post /orders/{orderId}/replay","title":"Replay Order","href":"/api-reference/endpoint/orders/replay-order"},{"openapi":"put /order-items/{orderItemId}/invalidate-giftcard","title":"Invalidate Gift Card","href":"/api-reference/endpoint/orders/invalidate-giftcard"}]},{"group":"Webhooks","icon":"list","pages":[{"openapi":"get /webhooks","title":"List Webhooks","href":"/api-reference/endpoint/webhooks/list-all"},{"openapi":"post /webhooks","title":"Create Webhook","href":"/api-reference/endpoint/webhooks/create-webhook"},{"openapi":"put /webhooks/{webhookId}","title":"Update Webhook","href":"/api-reference/endpoint/webhooks/update-webhook"},{"openapi":"delete /webhooks/{webhookId}","title":"Delete Webhook","href":"/api-reference/endpoint/webhooks/delete-webhook"}]},{"group":"Webhook Events","icon":"sparkles","pages":[{"openapi":"api-reference/openapi.json webhook orderItemStatusUpdate","title":"Order Item Status Change","href":"/api-reference/endpoint/webhook-events/order-item-status-change"},{"openapi":"api-reference/openapi.json webhook orderStatusUpdate","title":"Order Status Change","href":"/api-reference/endpoint/webhook-events/order-status-change"},{"openapi":"api-reference/openapi.json webhook orderItemDelivered","title":"Order Item Delivered","href":"/api-reference/endpoint/webhook-events/order-item-delivered"},{"openapi":"api-reference/openapi.json webhook qrCodeScanUpdate","title":"QR Code Scans","href":"/api-reference/endpoint/webhook-events/qr-code-scans"},{"openapi":"api-reference/openapi.json webhook scanBoardStatusUpdate","title":"Lead Board Stage Change","href":"/api-reference/endpoint/webhook-events/scan-board-stage-change"}]},{"group":"Utilities","icon":"wrench","pages":[{"openapi":"get /handwriting-styles","title":"List Handwriting Styles","href":"/api-reference/endpoint/handwriting-styles/list-styles"},{"openapi":"get /giftcard-brands-list","title":"List Gift Card Brands Flat","href":"/api-reference/endpoint/giftcards/list-brands-flat"},{"openapi":"get /giftcard-brands","title":"List Gift Card Brands","href":"/api-reference/endpoint/giftcards/list-brands"}]}]},{"group":"Examples","icon":"lightbulb","pages":[{"title":"Add Recipient to Campaign","icon":"address-card","tag":"Popular","href":"/workflows/campaign"},{"title":"PDF Letter Order","icon":"file-pdf","href":"/workflows/letter-pdf-order"},{"title":"Postcard Order","icon":"cards","href":"/workflows/postcard-order"},{"title":"Giftcard Order","icon":"gift","href":"/workflows/giftcard-order"}]}]},{"tab":"Native Integrations","pages":[{"title":"Native Integrations","href":"/native-integrations/introduction"}]},{"tab":"Webhooks ","pages":[{"title":"Webhooks ","href":"/webhooks/introduction"}]}]},"basePath":"","title":"Estimate Postcard - thanks.io Direct Mail Automation Toolkit","buildId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","deploymentId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DDP9JXtj.js","utils-8yQyvEtx.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CBCFR8Sn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-rQaXkUHa.js","snippetPresets-J5KpBTgV.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BVxVH4Cj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BxdQ2vIi.js","shallow-BjV2tFiD.js","getApiPlaygroundDisplay-C_55tL4O.js","CodeSnippet-C0JpiCOC.js","CodeSnippets-w9Ps7djG.js","Page-DTNSD-0M.js","getPastedJson-BDfB-H8d.js","icon-g-kUkkO9.js","MethodPill-v4l6fq0h.js","DuplicateIcon-CvLo-CfU.js","createIcon-165clrrV.js","DynamicMarkdown-D3RQ-fEj.js","SectionHeading-vvo-3yLf.js","axios-vUo_bRtp.js","Markdown-CMT1uFWQ.js","clsx-C8f2yC9R.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CI2D8R2Y.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-k78Wrw_e.js"]}