All integrations

thanks.io

MARKETING · MARKETING

Handwritten-style postcards, letters, and gift cards sent from that account.

Connect thanks.io with Fabriq Developer

Your user consents at thanks.io. The credential lands in a vault your agent cannot read, and the tool list it gets back is the intersection of that user’s grant and the agent’s own scopes.

provider “thanks_io”
from af_sdk import AgenticFabriq

af = AgenticFabriq()                      # reads AF_APP_ID / AF_APP_SECRET

url = await af.initiate_connection(request, provider="thanks_io")   # consent at thanks.io
return redirect(url)

async with await af.for_user(request) as session:
    tools = await session.get_tools()     # only what this user granted

Provider names are surfaces, not vendors, and the authoritative list is the capabilities endpoint rather than any page including this one — an unknown name returns 400 with the valid list. Fabriq Developer is free to start and needs no provider paperwork. Start free or read the quickstart.

Connecting thanks.io in practice

thanks.io caps the whole API at 60 requests a minute, which is the real constraint on a direct-mail agent that has to create a mailing list, add recipients and submit an order per customer. Testing mode auto-cancels orders, but a Radius Search bought in testing mode is still charged at $0.05 a record, so the sandbox is not free.

Scopes that draw scrutiny

  • Bearer token The documented default for "an internal integration for a single thanks.io account" — one token that can submit real, billable mail on that account.
  • OAuth authorization code The path for a SaaS or partner integration connecting multiple customer accounts, which means storing a token per customer. Access tokens have a limited lifespan and need refresh logic.

Rate limits

  • 60 requests per minute across the API. Over the limit returns 429 Too Many Requests.
  • Higher limits are granted by request to support@thanks.io rather than by plan.

Worth knowing

  • Testing mode cancels every order submitted through the API, so a pilot proves the payload and never proves delivery.
  • Radius Search records are charged at $0.05 each the moment they are bought, including in testing mode, where a purchase is capped at 5 records and a larger one returns 422 with nothing purchased. The dashboard keeps its 2,500-record limit.
  • Testing mode has to be switched off in API Settings before real orders fulfil, which is a dashboard step no API call reveals.
  • The OAuth authorize endpoint lives on dashboard.thanks.io rather than the API host, so the consent redirect and the API calls point at different domains.

Checked against thanks.io rate limits (2026-09-29), thanks.io API testing mode (2026-09-29), thanks.io choosing an authentication method (2026-09-29)

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

thanks_io_delete_mailing_lists_by_mailinglistidWRITE

Delete Mailing List. DELETE /mailing-lists/{mailingListId}.

api
thanks_io_delete_message_templates_by_messagetemplateidWRITE

Delete Message Template. DELETE /message-templates/{messageTemplateId}. Delete a message template.

api
thanks_io_delete_recipients_by_recipientidWRITE

Delete Recipient. DELETE /recipients/{recipientId}.

api
thanks_io_delete_sub_accounts_by_subaccountidWRITE

Delete Sub Account. DELETE /sub-accounts/{subAccountId}. All sub account orders and mailing lists are moved to the main account. All image templates, message templates, and campaigns are deleted.

api
thanks_io_delete_webhooks_by_webhookidWRITE

Delete Webhook. DELETE /webhooks/{webhookId}. Delete a webhook destination. Webhooks are available on paid subscriptions only.

api
thanks_io_get_giftcard_brandsREAD

List Brands. GET /giftcard-brands. List all available Giftcard brands. Reference data: thanks.io serves this endpoint without a credential, so it answers the same for every connection.

api
thanks_io_get_giftcard_brands_listREAD

List Brands Flat. GET /giftcard-brands-list. List all available Giftcard brands as a flat list. Reference data: thanks.io serves this endpoint without a credential, so it answers the same for every connection.

api
thanks_io_get_handwriting_stylesREAD

List Styles. GET /handwriting-styles. List Available Handwriting Styles Reference data: thanks.io serves this endpoint without a credential, so it answers the same for every connection.

api
thanks_io_get_image_templatesREAD

Image Templates: List All. GET /image-templates. List all available image templates.

api
thanks_io_get_mailing_listsREAD

Mailing Lists: List All. GET /mailing-lists. List all available mailing lists. Returns a paginated list of mailing lists.

api
thanks_io_get_mailing_lists_by_mailinglistidREAD

Mailing Lists: Get Details. GET /mailing-lists/{mailingListId}. Gets a mailing list by ID. Returns a single mailing list object.

api
thanks_io_get_mailing_lists_utils_recipients_by_mailinglistidREAD

List Recipients. GET /mailing-lists-utils/recipients/{mailingListId}. Retrieve recipients for a specific mailing list.

api
thanks_io_get_message_templatesREAD

Message Templates: List All. GET /message-templates. List all available message templates.

api
thanks_io_get_message_templates_by_messagetemplateidREAD

Get Message Template. GET /message-templates/{messageTemplateId}. Fetch a single message template by ID.

api
thanks_io_get_orders_by_orderid_itemsREAD

List Order Items. GET /orders/{orderId}/items. Return the individual mail pieces that make up an order, one entry per recipient, with that piece's delivery status, delivery date, QR scan count, failure reason and recipient address. Use this when you need per-piece detail; Track Order returns the same order as aggregate counts instead. Results are paginated and ordered by item ID, ascending. The order must belong to the authenticated account. For gift card orders each item also carries the gift card's `brand` and `amount`. The recipient's ten custom fields come back alongside the address, so the data you merged into the piece is available with it. Message content, creative and preview images, and per-item pricing are not part of this response; read those from the order itself.

api
thanks_io_get_orders_by_orderid_trackREAD

Track Order. GET /orders/{orderId}/track. Return Summary of delivery status for the order.

api
thanks_io_get_orders_listREAD

List Orders. GET /orders/list. Return list of recent orders.

api
thanks_io_get_recipients_by_recipientidREAD

Get Recipient. GET /recipients/{recipientId}. Get a recipient by ID.

api
thanks_io_get_sub_accountsREAD

Sub Accounts: List All. GET /sub-accounts. List all available sub-accounts.

api
thanks_io_get_sub_accounts_by_subaccountidREAD

Sub Accounts: Get Details. GET /sub-accounts/{subAccountId}. Gets a sub-account by ID. Returns a single sub-account object. branding_fields is an object that contains branding information for the sub-account - it can only be set via the thanks.io dashboard

api
thanks_io_get_webhooksREAD

List Webhooks. GET /webhooks. Return a paginated list of configured webhooks. Webhooks are available on paid subscriptions only.

api
thanks_io_patch_message_templates_by_messagetemplateidWRITE

Update Message Template. PATCH /message-templates/{messageTemplateId}. Update a message template using the public v2 request shape.

api
thanks_io_post_mailing_listsWRITE

Create Mailing List. POST /mailing-lists. If qrcode_url is provided, it will be used as the default QR Code URL when placing orders with this mailing list.

api
thanks_io_post_mailing_lists_utils_buy_radius_searchWRITE

Radius Search. POST /mailing-lists-utils/buy-radius-search. This call will purchase a radius search mailing listing and add it to your account. Each record added to the mailing list costs $.05. You can specify the number of records to return (up to 2,500) and the address/postal code to center the search around. You can also specify a mailing_list_id to add the results to an existing mailing list, or leave it blank to create a new mailing list. While API/Zapier Test Mode is enabled on the account, this endpoint is limited to 5 records per purchase — test mode cancels orders, but buying a radius search is not an order and is charged in full, so the limit is what keeps an integration under development from buying a full list by accident.

api
thanks_io_post_message_templatesWRITE

Create Message Template. POST /message-templates. Create a message template for the authenticated user using the public v2 request shape.

api
thanks_io_post_orders_by_orderid_replayWRITE

Replay Order. POST /orders/{orderId}/replay. Submit a copy of a previously placed order as a brand-new order. The same creative is charged and mailed again, and the original order is left untouched. By default the replay is sent to the recipients the original actually reached (failed items are excluded). Supply a `recipients` array to send the same creative to a different audience instead. Only settled, non-cancelled orders can be replayed. The replay is a fresh order that runs through the normal fulfillment pipeline, including Address Verification, Duplicate Prevention and suppression lists.

api
thanks_io_post_recipientsWRITE

Create Recipient. POST /recipients. Add a recipient. If you do not provide a valid mailing address but do provide a valid email address, thanks.io can attempt to look up a street address for an additional fee.

api
thanks_io_post_recipients_utils_create_multipleWRITE

Create Multiple Recipients. POST /recipients-utils/create-multiple. Add multiple recipients at once using a JSON array of recipient objects. If a recipient does not include a valid mailing address but does include a valid email address, thanks.io can attempt to look up a street address for an additional fee.

api
thanks_io_post_recipients_utils_delete_by_addressWRITE

Delete Recipient By Address. POST /recipients-utils/delete-by-address. Delete a recipient by using their address or their email address.

api
thanks_io_post_send_giftcardWRITE

Send Giftcard. POST /send/giftcard. Send a folded 4.25x5.5 giftcard in envelope.

api
thanks_io_post_send_magnacardWRITE

Send Magnacard. POST /send/magnacard. Send a Magnacard.

api
thanks_io_post_send_notecardWRITE

Send Notecard. POST /send/notecard. Send a folded 4.25x5.5 notecard in envelope.

api
thanks_io_post_send_postcardWRITE

Send Postcard. POST /send/postcard. Send a 4x6, 6x9, or 6x11 postcard.

api
thanks_io_post_send_windowedletterWRITE

Send Windowed Letter. POST /send/windowedletter. Send a letter in a windowed envelope.

api
thanks_io_post_send_windowlessletterWRITE

Send Windowless Letter. POST /send/windowlessletter. Send a letter in a windowless envelope.

api
thanks_io_post_sub_accountsWRITE

Create Sub Account. POST /sub-accounts. Create a new sub-account.

api
thanks_io_post_webhooksWRITE

Create Webhook. POST /webhooks. Create a webhook destination. Webhooks are available on paid subscriptions only.

api
thanks_io_put_orders_by_orderid_cancelWRITE

Cancel Order. PUT /orders/{orderId}/cancel. If Order is in _Reviewing_ Status, then this will cancel the order and refund the credits for the order back to your account. If the order can be successfully canceled, the status will be updated to _cancelled_.

api
thanks_io_put_recipients_by_recipientidWRITE

Update Recipient. PUT /recipients/{recipientId}. Update details of a specific recipient by ID.

api
thanks_io_put_sub_accounts_by_subaccountidWRITE

Update Sub Account. PUT /sub-accounts/{subAccountId}.

api
thanks_io_put_webhooks_by_webhookidWRITE

Update Webhook. PUT /webhooks/{webhookId}. Update an existing webhook destination. Webhooks are available on paid subscriptions only.

api

Put thanks.io behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.