# Transformer > Transformer (transformer.gg) is the agentic influencer marketplace. Real creators, paid on verified posts. Run it from the dashboard or from your agent. Paid partnerships on X (Twitter): a brand pastes its website, gets suggested X creators matched to it, and sends each an offer with the price and ask prefilled; creators accept, post in their own words with X's Paid partnership label on, submit the post URL and get paid once the post is verified on X. Every offer has a tracked link, so clicks and sales are attributed to the creator who drove them. Brands and creators can work in the web dashboard or hand the job to an agent through the MCP server, the CLI or the REST API. Key facts: - Two sides: brands (and the agents running their growth) and creators (and the agents managing their deals). Either side can be a person or an agent; nothing is dashboard-only. - Platform: X (Twitter) today. More networks later. - Pricing: no subscription, seats or minimums. Brands set the payout per offer. Creators keep 80% of the payout and of any sales commission; Transformer keeps 20%. Example: a $250 X post pays the creator $200. - Brand flow: website → suggested creators (matched from the brand's site; no brief to write) → offer (price and ask prefilled) → send (one or several creators at once; nothing is charged yet) → the creator accepts → the brand pays (balance first, then card or bank, within 72 hours) → track (sent, accepted, paid, posted, verified). The brand pays only for offers a creator accepts. Money from a declined or expired offer goes back to the brand's balance for the next offer. - Pay on accept: offers go out unpaid. When a creator accepts, the brand has 72 hours to pay (reminders at 24 and 60 hours); unpaid, the offer is cancelled and the creator is told. The creator posts only after the brand has paid, within 7 days of the payment. - Payment is held when the brand pays for an offer and released only when the post is verified on X: live, from the right account, with the tracked link and X's Paid partnership label on the post. The payment goes back to the brand's balance if the creator declines, the offer expires, or the brand cancels before acceptance; after the brand has paid either side can open a dispute, which freezes the payment until an admin releases or refunds it. When a post is verified, the creator's 80% goes into their balance; creators request a payout (from $10) and are paid by PayPal or USDC (Solana or Base), usually within 3 business days. - Creators sign in with X read-only. Transformer never posts on a creator's behalf, never reads DMs and never stores long-lived X tokens. - An ask, not a script: creators write their own posts. - Attribution: each accepted offer gets a tracked link (https://transformer.gg/r/) that appends a tf_click id to the brand's URL. The brand reports sales with POST /api/v1/conversions and commission is calculated per sale. Per-creator landing pages and a visit pixel are supported. - Agent access: MCP server at https://transformer.gg/mcp (streamable HTTP), REST API at https://transformer.gg/api/v1, CLI installed with `curl -fsSL https://transformer.gg/install | sh`. MCP clients that support sign-in (Claude, Claude Code, ChatGPT, Cursor, …) just add the URL and sign in with X, picking the workspace the agent acts for (OAuth 2.1, revocable in Settings → Agents). Headless agents, the REST API and the CLI use a workspace API key (tf_live_…) as a bearer token; one key or connection acts for exactly one brand or creator workspace. - Operated by North Bay Opco I, Inc. (a Delaware corporation), Miami, Florida. Support: support@transformer.gg. ## Docs - [Developer docs](https://transformer.gg/docs): quickstart, authentication, concepts, MCP tools, CLI and REST reference - [Quickstart](https://transformer.gg/docs#quickstart): account, workspace, API key, connect an agent - [Concepts](https://transformer.gg/docs#concepts): workspaces, offer lifecycle, deliverables, tracked links, conversions, payments - [MCP server](https://transformer.gg/docs#mcp): tools for searching creators, sending and accepting offers, submitting posts and reporting sales - [REST reference](https://transformer.gg/docs#rest): endpoints under /api/v1 - [Conversion tracking](https://transformer.gg/docs#tracking): tf_click, server-side conversions, landing pages, pixel ## Product - [Home](https://transformer.gg/): what Transformer is, how it works for brands and creators, pricing - [Pricing](https://transformer.gg/pricing): 80% to creators, 20% platform fee, pay per offer, pricing FAQ - [For creators](https://transformer.gg/#creators): get paid to post on X ## Articles - [Blog](https://transformer.gg/blog): influencer marketing, explained (RSS: https://transformer.gg/blog/rss.xml; every article also has a .md version) - [How to get free products from brands (and when to ask for payment instead)](https://transformer.gg/blog/how-to-get-free-products-from-brands.md): Creators get free products through brand gifting and seeding programs, creator platforms, and short, specific pitches to brands they already use. Gifted posts still need disclosure. When free product is worth it, when to ask for a fee, and how to move from gifts to paid deals. - [How do brands pay influencers? Payment models, methods and when to pay (with X paid partnerships)](https://transformer.gg/blog/how-do-brands-pay-influencers.md): Most brands pay influencers a flat fee per post, sometimes plus a commission on sales, gifted product or a monthly retainer. How each model works, how the money moves, when to pay so neither side is exposed, and how paying creators for paid partnerships on X works on Transformer. - [Influencer platforms that don't need your X password or DMs: how to check what an app can do](https://transformer.gg/blog/influencer-platforms-without-x-password.md): A safe creator platform never asks for your X password: you sign in on X itself and approve specific permissions. Which X permissions to look for (tweet.read, users.read) and which to question (tweet.write, dm.read, dm.write, offline.access), and exactly what Transformer asks for. - [A CLI for influencer marketing: run creator campaigns from the terminal](https://transformer.gg/blog/influencer-marketing-cli.md): Transformer's CLI runs paid partnerships on X from the command line: search creators, send offers, pay for accepted ones, track posts and clicks, report sales, and get creators paid on verified posts. Install with one line; every command is one REST call, with --json for scripts and agents. - [Collabstr alternatives: Transformer vs Collabstr (2026 pricing and fees)](https://transformer.gg/blog/transformer-vs-collabstr.md): Collabstr is a marketplace to hire Instagram, TikTok, YouTube and UGC creators, with a free plan (10% hiring fee) or plans from $249 a month. Transformer is a pay-per-verified-post marketplace on X with no subscription. Fees, how payment is protected, and which fits. - [CreatorIQ pricing in 2026: what it costs and what drives the price](https://transformer.gg/blog/creatoriq-pricing.md): CreatorIQ doesn't publish prices; you request pricing on a call. Vendr's buyer data puts the median at $39,250 a year, with a range of about $30,000–$59,500. What changes the price, how contracts work, and lower-cost options. - [How to choose an influencer marketing platform: types, costs and free options](https://transformer.gg/blog/how-to-choose-an-influencer-marketing-platform.md): Influencer marketing platforms range from free plans and pay-per-post marketplaces to $30,000+ a year enterprise suites. What a platform and a creator marketplace are, the main types, what they cost in 2026, which are free, and how to pick the right one. - [How to find and vet influencers that fit your product](https://transformer.gg/blog/how-to-find-and-vet-influencers.md): Find influencers your customers already follow, then vet them on audience fit, real engagement, content history, disclosure and brand safety. A step-by-step checklist, the questions to ask a creator before booking, and how to do it on X. - [UGC creators in 2026: what UGC and UGC platforms cost, how creators find deals and get paid, and how to start](https://transformer.gg/blog/ugc-creator-guide.md): A UGC creator makes photos and videos that brands post on their own channels and ads. A UGC video typically costs a brand $150–$300 (about $212 on average). Types of UGC videos, where brands hire UGC creators, how creators find deals and get paid, faceless UGC and how to start. - [How do content creators make money? Getting paid to promote brands on X](https://transformer.gg/blog/how-creators-make-money-on-x.md): Creators earn from platform payouts, brand deals, affiliate links, products and subscriptions. On X that means Original Content Rewards and sponsored posts. How each works, who pays you, and how to get paid to promote brands. - [How to run an influencer campaign on X, step by step](https://transformer.gg/blog/how-to-run-an-influencer-campaign-on-x.md): Set one goal, define who you need to reach, shortlist creators those people follow, write a short ask, set the price, pay only for verified posts and measure each creator with a tracked link. A step-by-step plan for X, with what a first campaign costs. - [Which platform pays creators the most? Pay per 1,000 and per million views (2026)](https://transformer.gg/blog/do-creators-get-paid-per-1000-views.md): YouTube long-form pays most per view: about $2–$12 per 1,000 views ($2,000–$12,000 per million). TikTok pays about $0.40–$1.00 per 1,000 qualified views, Shorts and Instagram far less, and X doesn't publish a rate. How many views a monthly income takes, and why brand deals pay per post. - [How much should you budget for your first influencer campaign?](https://transformer.gg/blog/influencer-marketing-budget-first-campaign.md): Build the budget from the bottom up: number of creators × price per post, plus a reserve to re-book the winners. A first test on X with 8 creators can cost under $1,000. How to size it, split it across channels and decide whether to spend more. - [Paid partnership rules on X: the Paid partnership label, #ad and what the FTC requires](https://transformer.gg/blog/ad-disclosure-rules-on-x.md): Paying creators for posts on X is allowed if the post is disclosed. Since March 2026 X expects its built-in Paid partnership label on every paid post; the FTC still recommends your own disclosure such as #ad. What can't be promoted in the UK, EU and Australia, liability, penalties and non-US rules. - [How much should you pay an influencer? A pricing guide for brands](https://transformer.gg/blog/how-much-to-pay-an-influencer.md): Start from audience size, then adjust for niche, engagement, format, usage rights and exclusivity. Benchmarks by platform, a rule of thumb for X (about $2 per 1,000 followers), how to tell if a quote is fair and how to negotiate without lowballing. - [How to make an influencer rate card for X (and negotiate your first brand deal)](https://transformer.gg/blog/influencer-rate-card-x.md): A rate card lists your prices for a post, a thread and a video, plus add-ons like usage rights and what's included. How to set each price for X (about $2 per 1,000 followers is a common starting point), what to charge for a first deal, how often to raise rates and how to negotiate. - [Influencer usage rights explained: ownership, paid ads, whitelisting and what to charge](https://transformer.gg/blog/influencer-usage-rights.md): Paying for a sponsored post doesn't make the brand the owner of the content. Usage rights set how a brand may reuse it and for how long. 2026 benchmarks: paid usage adds about 15–30% of the base fee per 30 days, whitelisting 25–50%. - [Is this sponsorship offer legit? How creators spot fake brand deals](https://transformer.gg/blog/is-this-sponsorship-offer-legit.md): Fake brand deals ask you to pay first, buy the product, hand over bank details, or move fast before you can check. The FTC's red flags, a checklist before you accept, how to verify a brand, and how to tell if a creator marketplace is legitimate. - [How to reach out to influencers: message templates that get replies](https://transformer.gg/blog/how-to-reach-out-to-influencers.md): Lead with why you picked them, say what you're offering and what it pays, and make yes easy. Copy-paste DM and email templates for first contact, follow-ups and creators pitching brands, plus whether to use email or DMs. - [Nano and micro-influencers on X: what they are, nano vs micro vs macro, and what a good CPM is](https://transformer.gg/blog/micro-influencers-on-x.md): A nano-influencer usually has about 1,000–10,000 followers; a micro-influencer about 10,000–100,000. For a first campaign, micro creators cost less per post and get more views and engagement relative to their size. How to calculate CPM and cost per signup, what benchmarks say, and how micro creators on X get brand deals. - [How many followers do you need to make money? Brand deals and platform payouts](https://transformer.gg/blog/how-many-followers-for-brand-deals.md): Brand deals have no hard minimum: nano creators with 1,000–10,000 followers get paid. Platform payouts do: X needs 500+ verified followers, YouTube 1,000 subscribers, TikTok 10,000 followers. Thresholds, tiers, what brands check and how to land your first deal. - [Best influencer marketing platforms for developer tools and B2B SaaS (2026)](https://transformer.gg/blog/best-influencer-platforms-for-developer-tools.md): Which creator-marketing platforms fit developer tools, AI startups and B2B SaaS, grouped by job: X-native pay-per-post (Transformer), multi-channel B2B (Passionfroot), YouTube sponsorships (ThoughtLeaders), B2B discovery (Favikon), and full suites (GRIN, Upfluence, Aspire, CreatorIQ). - [How sponsorship payouts work on Transformer: 80% to you, PayPal or USDC, $10 minimum and tax forms](https://transformer.gg/blog/how-sponsorship-payouts-work.md): For creators: what you earn (80%), when it's credited (when your post is verified on X with the Paid partnership label), how payouts work (PayPal or USDC, from $10), and when you need a W-9 or W-8BEN. - [How Transformer works: payment protection, the 80/20 split and verified posts](https://transformer.gg/blog/how-transformer-payment-protection-works.md): Brands paste their website, pick suggested X creators and send prefilled offers for free; they pay when a creator accepts. The payment is held, the creator posts after payment, and it's released when the post is verified on X with the Paid partnership label. Creators keep 80%. The full flow, with the exact rules. - [How to run an influencer campaign from an AI agent (MCP)](https://transformer.gg/blog/run-influencer-campaign-from-ai-agent-mcp.md): A step-by-step guide to running paid partnerships on X from Claude, Codex or any MCP client: connect Transformer's MCP server, get suggested creators for your brand, write the asks, send offers free, pay for the ones creators accept, then track verification, clicks and sales. - [How much do influencers charge per post? Rates by follower count, and what we pay on X](https://transformer.gg/blog/sponsored-post-rates-by-follower-count.md): Influencer rates scale with followers and platform: about $20–$100 per Instagram post for nano creators, and around $2 per 1,000 followers on X. What brands pay, what creators earn and how to set your rate. - [Transformer vs GRIN: which influencer platform fits your team?](https://transformer.gg/blog/transformer-vs-grin.md): GRIN is a creator-management suite for e-commerce brands, with plans from free to $1,500/month plus a fee on wallet deposits. Transformer is an X-native, pay-per-verified-post marketplace with no subscription and an API/MCP for agents. Here's how they compare. - [How to get paid to post about developer tools on X](https://transformer.gg/blog/get-paid-to-post-about-dev-tools-on-x.md): A guide for developers and tech creators on X: how sponsorships work, what you can earn, how to disclose correctly (#ad plus X's Paid Partnership label), and how to get offers from dev-tool brands on Transformer. - [How to pay creators per verified post (and never pay for a post that didn't happen)](https://transformer.gg/blog/pay-creators-per-verified-post.md): Pay-per-verified-post means the creator's payment is held until their post is checked live, from their account, with your link and a paid-partnership disclosure. Here's how to set it up, what to verify and what it costs on Transformer. - [Transformer vs Aspire: influencer platforms compared for startups](https://transformer.gg/blog/transformer-vs-aspire.md): Aspire is a demo-led influencer platform sold on annual contracts (third parties estimate roughly $11K–$37K a year). Transformer has no subscription: brands pay per offer on X, payment is held until the post is verified, and creators keep 80%. - [The developer influencer marketing playbook: how dev tools get distribution from creators](https://transformer.gg/blog/developer-influencer-marketing-playbook.md): A practical playbook for developer tools and AI startups: who to sponsor, how to brief technical creators, what to pay by follower tier, how to verify and measure, and the mistakes that make developers tune out. - [Transformer vs CreatorIQ: enterprise creator platform or pay-per-post marketplace?](https://transformer.gg/blog/transformer-vs-creatoriq.md): CreatorIQ is an enterprise creator-marketing platform for large brands, sold on annual contracts (Vendr data: about $30K–$60K a year). Transformer is a pay-per-verified-post marketplace on X with no subscription and an API/MCP for agents. - [Transformer vs Upfluence: modular influencer suite or pay-per-post on X?](https://transformer.gg/blog/transformer-vs-upfluence.md): Upfluence sells modular influencer software on 12-month contracts and has an MCP server in beta for search and workflow. Transformer has no subscription, holds payment until each X post is verified, and exposes the whole flow, payments included, over MCP and an API. - [Transformer vs Passionfroot: B2B creator sponsorship platforms compared](https://transformer.gg/blog/transformer-vs-passionfroot.md): Passionfroot is a B2B creator marketplace across LinkedIn, newsletters, YouTube and podcasts (2% fee on direct deals, 15% on matched deals). Transformer is X-native: pay-per-verified-post offers with the payment held until verification, an 80/20 split, and an MCP server and API for agents. - [Transformer vs Modash: influencer discovery tool or influencer marketplace?](https://transformer.gg/blog/transformer-vs-modash.md): Modash is an influencer discovery and management tool for Instagram, TikTok and YouTube, from $199/month billed yearly. Transformer is a marketplace for paid, verified posts on X with no subscription. Different jobs; here's when to use which. - [Transformer vs Influencity: influencer software or pay-per-post marketplace?](https://transformer.gg/blog/transformer-vs-influencity.md): Influencity is influencer marketing software (discovery, CRM, campaigns, payments) with a 7-day trial and subscription plans. Transformer has no subscription: brands pay per offer on X, payment is held until the post is verified, and creators keep 80%. - [GRIN, Aspire and CreatorIQ alternatives for startups](https://transformer.gg/blog/grin-aspire-creatoriq-alternatives-for-startups.md): GRIN, Aspire and CreatorIQ are built for established consumer brands, with subscriptions or annual contracts. Startups usually need something lighter: pay-per-post marketplaces, self-serve discovery tools or per-deal fees. Here are the options and what they cost. - [What is influencer marketing, how does it work, and why it matters more than ever](https://transformer.gg/blog/why-influencer-marketing-matters.md): Influencer marketing is paying creators to tell their audience about your product. How it works step by step, what an influencer is, the types of creators, and why it works: people trust people more than ads, attention moved to creators, and results can now be measured. - [Shipping code is easy now. Distribution is the hard part.](https://transformer.gg/blog/distribution-is-the-hard-part.md): AI coding tools made building software cheap and fast, so the bottleneck has moved to getting it in front of people. Here is why creators are the most underused distribution channel for builders. - [People trust people, not ads: the case for creator marketing](https://transformer.gg/blog/people-trust-people-not-ads.md): Recommendations from people we know beat every form of advertising on trust. Creators sit close to that, and clear #ad disclosure keeps the trust intact. Here's why it works and how not to break it. - [Product discovery moved to creators and AI answers](https://transformer.gg/blog/discovery-moved-to-creators-and-ai-answers.md): Buyers increasingly find products in social feeds and AI chat answers instead of search results. Creator posts feed both, which makes influencer marketing a discovery strategy, not just an awareness one. - [Influencer marketing is measurable now: links, click ids and conversions](https://transformer.gg/blog/influencer-marketing-is-measurable.md): How to measure creator marketing: set the goal, then climb the ladder from verified post to reach, tracked clicks, server-side conversions and cost per acquisition. How each step works, and how Transformer reports it. - [Why smaller creators often outperform big influencers](https://transformer.gg/blog/why-micro-creators-outperform.md): Engagement rates tend to fall as follower counts rise. Micro and nano creators offer focused audiences, higher engagement and lower cost per post, which makes them the best place to start. - [Influencer marketing vs paid ads: when each one wins](https://transformer.gg/blog/influencer-marketing-vs-paid-ads.md): Paid ads buy reach on demand; creators bring trust and a targeted, engaged audience. Here is how the two compare on cost, trust, targeting and measurement, and how to use them together. - [The creator economy by the numbers: how big is influencer marketing?](https://transformer.gg/blog/creator-economy-by-the-numbers.md): Global influencer marketing is estimated at about $32.55 billion in 2025, US spend passed $10 billion, and Goldman Sachs projects the creator economy could approach $480 billion by 2027. The key figures, with sources. - [Influencer marketing for startups: why X is the place to start](https://transformer.gg/blog/influencer-marketing-for-startups-on-x.md): For startups, developer tools and B2B products, X is where builders, founders and early adopters talk in public. Here's why creator posts on X work for startups and how to run a first campaign. - [AI agents will run influencer marketing. Here's why that matters.](https://transformer.gg/blog/ai-agents-will-run-influencer-marketing.md): Most of the work in influencer marketing, from finding creators to verifying posts and reporting sales, is repetitive coordination that software and AI agents can do. Here's what an agent-run campaign looks like on both sides. ## Optional - [Terms of Service](https://transformer.gg/terms) - [Privacy Policy](https://transformer.gg/privacy) - [Full version of this file](https://transformer.gg/llms-full.txt): adds the offer lifecycle, MCP tool list, API examples, FAQ and the full developer docs as Markdown ## Connect an agent 1. Sign in at https://transformer.gg/login (email, Google, GitHub or X). 2. Create a workspace: brand if you send offers, creator if you receive them. Creators connect their X account. 3. On the workspace page, create an API key (shown once, starts with tf_live_). Store it as TRANSFORMER_API_KEY. 4. Connect: ```bash # Claude Code (MCP), with sign-in: run /mcp in Claude Code and pick "transformer" to sign in claude mcp add --transport http transformer https://transformer.gg/mcp # Claude Code (MCP), headless with an API key claude mcp add --transport http transformer https://transformer.gg/mcp --header "Authorization: Bearer $TRANSFORMER_API_KEY" # Any MCP client (mcp.json) { "mcpServers": { "transformer": { "url": "https://transformer.gg/mcp", "headers": { "Authorization": "Bearer tf_live_…" } } } } # CLI curl -fsSL https://transformer.gg/install | sh && transformer login # REST curl https://transformer.gg/api/v1/me -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` ## Offer lifecycle sent → accepted → submitted → verified → paid. Also: sent → declined (creator), sent/accepted → cancelled (brand), sent → expired (unanswered after expiresInDays, 7 by default). - An offer has a title, a brief, a link to promote (url), a deliverable (post, thread or video on X), a quantity (1–20), a payout in USD and an optional commissionPercent on sales. - Brands address creators by X handle, email or creator workspace id. The creator who accepts must own that handle. - postLink is the exact link the creator puts in the post; mustInclude lists what verification checks for (that link, and X's Paid partnership label on the post; #ad in the text as well). - paymentStatus: unfunded, funded, released, paid_out or refunded. ## MCP tools | Tool | Key | What it does | | --- | --- | --- | | whoami | either | The workspace this key acts for (brand or creator) | | search_creators | brand | Find creators by keyword or X handle | | suggestions | brand | Suggested X creators for your brand (no brief): why each fits, price band, followers, topics | | write_asks | brand | A short auto-written ask per suggested creator | | add_creators | brand | Add X creators by handle who aren't indexed yet; we look them up and index them (contacts nobody) | | list_added_creators | brand | Creators you added and their status: queued, indexing, ready, not_found, unavailable | | create_offer | brand | Send a creator an offer: ask, link, deliverable, payout, commission | | send_offers | brand | Send offers to one or many creators (price and ask each); nothing is charged until a creator accepts | | pay_offers | brand | Pay for accepted offers (stage awaiting_payment) within 72 hours: balance first, then a checkout link | | list_offers | either | Offers sent (brand) or received (creator), optionally by status | | get_offer | either | One offer with its tracked link, submissions and payment state | | accept_offer | creator | Accept an offer and get its tracked link | | decline_offer | creator | Decline an offer | | cancel_offer | brand | Cancel an offer that hasn't been accepted, or an accepted one you haven't paid for yet | | submit_post | creator | Submit an existing X post URL for verification | | get_my_profile | creator | This creator's directory profile (connecting X lists it): visibility, headline, niches, rate card | | update_my_profile | creator | Edit the profile; visibility listed or hidden | | remove_my_profile | creator | Delete the directory profile and keep it out of the index | | report_conversion | brand | Report a sale with the tf_click id, handle or offerId; the same orderId twice is ignored | | offer_stats | either | Clicks, conversions, revenue and commission for an offer | | get_earnings | creator | Per-offer earnings (the creator's 80%: pending or credited) plus the balance | | get_balance | creator | Available (credited − paid − requested), requested, paid (lifetime and this year), pending; minimum payout; tax form status | | list_payout_methods | creator | Saved payout methods, masked, and which method types are enabled | | add_payout_method | creator | Save a payout method of a type that's offered now (list_payout_methods says which) | | remove_payout_method | creator | Remove a saved method | | request_payout | creator | Request some or all of the available balance (min $10) to a saved method; holds the funds until paid | | list_payout_requests | creator / admin | Your requests; admin keys pass status for the platform queue | | cancel_payout | creator | Cancel an unpaid request; the amount returns to the available balance | | submit_tax_form | creator | W-9 or W-8BEN, typed-name e-signature; needed once a year's payouts reach the threshold | | get_tax_form | creator | Tax form status (type, signed, expiry, TIN last 4) | | mark_paid | admin | Mark a request paid with the transfer reference, fee and date | ## REST examples ```bash # Brand: send @jane an offer curl https://transformer.gg/api/v1/offers -H "Authorization: Bearer $TRANSFORMER_API_KEY" -H "Content-Type: application/json" \ -d '{"creator":"@jane","title":"Launch week","brief":"Share what you think of Acme","url":"https://acme.com/launch","deliverable":"post","quantity":1,"payoutUsd":250,"commissionPercent":10}' # Creator: accept, post on X yourself (link, Paid partnership label on), then submit the post URL curl -X POST https://transformer.gg/api/v1/offers/$OFFER_ID/accept -H "Authorization: Bearer $TRANSFORMER_API_KEY" curl https://transformer.gg/api/v1/offers/$OFFER_ID/submissions -H "Authorization: Bearer $TRANSFORMER_API_KEY" -H "Content-Type: application/json" \ -d '{"url":"https://x.com/jane/status/123"}' # Creator: balance, and which payout methods are offered right now curl https://transformer.gg/api/v1/balance -H "Authorization: Bearer $TRANSFORMER_API_KEY" curl https://transformer.gg/api/v1/payout-methods -H "Authorization: Bearer $TRANSFORMER_API_KEY" # Brand: report a sale from your backend curl https://transformer.gg/api/v1/conversions -H "Authorization: Bearer $TRANSFORMER_API_KEY" -H "Content-Type: application/json" \ -d '{"clickId":"","amountUsd":49.00,"orderId":"A-1001"}' ``` Errors are JSON ({"error": "…"}, sometimes with a "code") with 400 invalid input, 401 missing or revoked key, 403 wrong side, 404 not found, 409 wrong state (or code "tax_form_required" for a payout above the yearly tax-form threshold), 422 post failed verification, 429 rate limited. ### Payouts - GET /balance (or /earnings with per-offer items): availableUsd = creditedUsd − paidUsd − requestedUsd; paidThisYearUsd; pendingUsd (offers not yet verified); minPayoutUsd 10; taxFormRequired. - GET/POST /payout-methods, PATCH/DELETE /payout-methods/:id. GET's options.methods lists what's offered now (payouts are paid by PayPal or USDC; while none is offered, options.notice says so and earnings wait in the balance). Types the platform supports: wise {name, email, country, currency} (default; currencies Wise can't pay by email are refused with code "wise_currency_not_supported"), ach {holderName, routingNumber, accountNumber, accountType}; wise_bank {currency, country, accountHolderName, recipientType, details} for currencies Wise can't pay by email, with fields from GET /payout-methods/wise-requirements?currency=&country= (only when enabled); paypal, crypto (asset, network, address + addressConfirm) and cashapp only when enabled. Responses are masked. - GET/POST /payout-requests {amountUsd?, methodId?}, POST /payout-requests/:id/cancel. Statuses: requested (or "flagged" when a payout method changed within 24 h), paid, rejected, cancelled. - GET/POST /tax-form: W-9 or W-8BEN with signature (your typed name) and certify: true. Webhooks are not available yet; poll offers and stats. ## FAQ ### What is Transformer? An influencer marketing marketplace where brands pay creators to post on X, with payment held until the post is verified and tracked links that attribute clicks and sales. It is built so AI agents can run either side through MCP, a CLI or a REST API. ### How much does Transformer cost? Nothing up front: no subscription, seats or minimums. The brand chooses each offer's payout; the creator receives 80% and Transformer keeps 20%. The same split applies to sales commission. There is no subscription. ### How do creators get paid? The brand pays for an offer when the creator accepts (offers go out unpaid), and the payout is held; the creator posts only after that. Once the creator's post is verified on X, the creator's 80% is credited to their balance. Creators request a payout from $10 and are paid by PayPal or USDC, usually within 3 business days. A W-9 or W-8BEN is needed once a year's payouts reach the threshold. ### Can an AI agent run influencer campaigns on Transformer? Yes. Give an agent a brand workspace key and it can search creators, send offers, track results and report conversions over MCP (https://transformer.gg/mcp), the CLI or the REST API. A creator's agent can triage offers, accept them and submit posts for verification. ### Does Transformer post for creators or read their DMs? No. Sign in with X is read-only. Creators publish from their own accounts and paste the post URL; Transformer verifies it with public data. ### Which social networks are supported? X (Twitter) today. Others are planned. ### How are sales attributed to a creator? Each accepted offer has a tracked link that adds a tf_click id to the brand's URL. The brand's backend reports the sale with that id (or the creator's handle) and commission is credited to the creator. Repeating an orderId is ignored, so retries are safe. ## Developer docs (https://transformer.gg/docs) Everything in the dashboard is an API call. Brands and creators, people and agents, all use the same REST API, MCP server and CLI with a workspace key. ### Quickstart - **Create an account.** [Sign in](https://transformer.gg/docs?signin=1) with email, Google or GitHub. - **Create a workspace.** Choose *brand* if you send offers, or *creator* if you receive them. Creators connect their X account from the workspace page. - **Create an API key.** On the workspace page, under API keys, create a key. It's shown once and looks like `tf_live_…`. Store it as `TRANSFORMER_API_KEY`. - **Connect your agent.** Pick one: Claude Code (MCP) ``` claude mcp add --transport http transformer https://transformer.gg/mcp --header "Authorization: Bearer $TRANSFORMER_API_KEY" ``` CLI ``` curl -fsSL https://transformer.gg/install | sh transformer login ``` REST ``` curl https://transformer.gg/api/v1/me \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` ### Authentication Every agent-facing request carries a workspace API key as a bearer token: Header ``` Authorization: Bearer tf_live_… ``` - **One key = one workspace.** A key acts for exactly one workspace and can only see and change that workspace's offers. Create separate keys per agent or environment and revoke any of them from the workspace page. - **Brand vs creator.** The workspace's kind decides what the key can do. Brand keys search creators, create, fund and cancel offers, and report conversions. Creator keys accept or decline offers and submit the URLs of posts they published on X. Both can list offers, read an offer and read its stats. - **Keep keys server-side.** Never ship a key to a browser or mobile app. Conversion reporting in particular belongs on your backend. Errors are JSON with an `error` message and a matching HTTP status: `400` invalid input, `401` missing or revoked key, `403` wrong side (e.g. a creator key creating an offer), `404` not found or not yours, `409` the offer isn't in a state that allows this, `422` a post failed verification. 401 ``` { "error": "Invalid or revoked API key." } ``` ### Concepts #### Workspaces A workspace is a brand or a creator. People join workspaces as members; agents act for a workspace through its API keys. A creator workspace has one connected X account. #### Offers and their lifecycle An offer is what a brand sends a creator: a title and note (`brief`), a link to promote (`url`), a deliverable, a quantity, a payout and an optional commission on sales. Brands address creators by X handle (or by email, or creator workspace id); the creator who accepts must own that handle. Unanswered offers expire after `expiresInDays` (7 by default). sent → accepted → submitted → verified → paidsent → declined · sent / accepted → cancelled · sent → expired - `sent`: the brand created the offer; the creator gets an invite. - `accepted`: the creator accepted; a tracked link now exists. The brand then pays within 72 hours (until it does, `stage` is `awaiting_payment`, `funding.due` says how much and by when, and submitting a post returns 409 `payment_pending`); unpaid, the offer is cancelled. - `submitted`: some, but not yet all, of the deliverables have been verified. - `verified`: every deliverable is live on X, from the right account, with the tracked link. - `paid`: the held payout was released to the creator. - `declined` by the creator, `cancelled` by the brand, or `expired` unanswered. #### Deliverables `post` (a single X post), `thread` (an X thread) or `video` (an X post with video). `quantity` (1–20) is how many of them the offer covers. X is the first platform; more will follow. #### Tracked links and tf_click When a creator accepts, the offer gets a tracked link like `https://transformer.gg/r/k3v9x2`. Each click is counted and redirected to the offer's `url` with a `tf_click` query parameter appended, e.g. `https://acme.com/launch?tf_click=b2e7d4a1-5c3f-4e8a-9d61-7a0c2f9e8b14`. That id identifies the click, and through it the offer and creator. #### The link creators post: postLink Every offer has a `postLink`, the exact link the creator puts in their post, and `mustInclude`, the list verification checks for (that link and the disclosure). The post must carry X's Paid partnership label; `#ad` in the text counts only where X doesn't report the label. If the brand has a landing page per creator, set a `landingUrlTemplate` such as `https://acme.com/x/{handle}` (on the brand's pricing settings, a template, or the offer itself): each offer then gets its own `landingUrl`, e.g. `https://acme.com/x/jane`, and that is the `postLink`. Otherwise `postLink` is the tracked `/r/…` link (which redirects to the creator's landing page, if there is one, with `?tf_click=` appended). Verification accepts the link as X shows it (expanded from t.co), ignoring scheme, `www.`, case, a trailing slash and the query string. #### Conversions and commission A conversion is a sale the brand reports with the `tf_click` id, an amount and its own order id. If the offer has a `commissionPercent`, commission is calculated on the amount and credited to the creator. Order ids are unique per offer, so reporting the same order twice is a no-op and retries are safe. If a sale can't be tied to a click, report it with the creator's `handle` (their latest live offer from you) or the `offerId`. #### Payments Offers go out unpaid; the brand pays when the creator accepts (`POST /offers/:id/pay` or `POST /pay-due`, within 72 hours), and the payout is held. When the creator's deliverables are verified on X, the held payout is released to the creator; the offer moves to `paid` once it's paid out. Each offer reports its `paymentStatus`: `unfunded`, `funded`, `released`, `paid_out` or `refunded`. #### Webhooks Not yet available. Poll `GET /api/v1/offers` and `GET /api/v1/offers/{id}/stats` for now. ### MCP Transformer runs an MCP server at `https://transformer.gg/mcp` over streamable HTTP, authenticated with the same workspace key. Add it to any MCP client: mcp.json ``` { "mcpServers": { "transformer": { "url": "https://transformer.gg/mcp", "headers": { "Authorization": "Bearer tf_live_…" } } } } ``` Claude Code: shell ``` claude mcp add --transport http transformer https://transformer.gg/mcp --header "Authorization: Bearer $TRANSFORMER_API_KEY" ``` #### Tools | Tool | Key | What it does | | --- | --- | --- | | whoami | either | The workspace this key acts for (brand or creator). | | search_creators | brand | Find creators by topic or handle, with filters: followers, niche, engagement, price, verified, worked with you. | | create_offer | brand | Send a creator an offer: what to post about, link, payout, commission. | | list_offers | either | Offers sent (brand) or received (creator), optionally by status. | | get_offer | either | One offer, with its tracked link, submissions and payment state. | | accept_offer | creator | Accept an offer and get its tracked link. | | decline_offer | creator | Decline an offer. | | cancel_offer | brand | Cancel an offer that hasn't been completed. | | submit_post | creator | Submit an existing X post URL for verification. | | report_conversion | brand | Report a sale with the tf_click id (or an offerId). The same orderId twice is ignored. | | offer_stats | either | Clicks, conversions, revenue and commission for an offer. | | pay_offers | brand | Pay for offers creators accepted (you pay only on accept, within 72 hours): balance first, then a checkout link. | | list_deals | creator | Accepted offers with their next step (post, submit, verified, paid) and due date. | | submit_deal_post | creator | Submit the post URL for a deal so it can be verified. | | list_accounts | creator | Your connected X accounts, with pending verifications. | | start_account_verification | creator | Start verifying an account: returns a code to put in the bio. | | verify_account | creator | Check the bio for the code and connect the account. | Tool inputs mirror the REST request bodies below: offer tools take an `offerId`, `search_creators` takes a `query`. Results are the same JSON the REST API returns; failures come back as tool errors with the same message. ### CLI Install the `transformer` binary, then sign in with a workspace API key: $curl -fsSL https://transformer.gg/install | sh commands ``` transformer login # paste a workspace API key transformer me transformer creators search fitness transformer offers create --creator @jane --deliverable post --payout 250 --url https://acme.com/launch --brief "Share what you think of Acme" transformer offers list --status sent transformer offers accept transformer submit https://x.com/jane/status/123 transformer conversions report --click --amount 49 --order A-1001 transformer stats ``` `transformer login` stores the key locally. In CI or agent sandboxes, set `TRANSFORMER_API_KEY` instead. Every command calls the REST endpoint of the same name. ### REST reference Base URL `https://transformer.gg/api/v1`. Requests and responses are JSON. Amounts are in US dollars. In the examples, `$OFFER_ID` is an offer's `id`. GET`/api/v1/me`brand or creator key The workspace this key acts for, its connected X account (creators) and totals. Use it to check whether you're on the brand or creator side. Request ``` curl "https://transformer.gg/api/v1/me" \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "workspace": { "id": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "kind": "brand", "name": "Acme" }, "x": null, "stats": { "offers": 4, "active": 1, "completed": 2, "payoutsUsd": 500, "clicks": 640, "revenueUsd": 882, "commissionUsd": 88.2 } } ``` GET`/api/v1/creators?q=fitness`brand key Search creators with a connected X account, by handle or name. Up to 50 results, largest audience first. | Field | Type | Description | | --- | --- | --- | | q | string | Part of an X handle or name. | Request ``` curl "https://transformer.gg/api/v1/creators?q=fitness" \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "creators": [ { "workspaceId": "c41a9e2d-7b6f-4a1e-9c3d-5e8f7a6b2c10", "name": "Jane Park", "x": "@jane", "xName": "Jane Park", "followers": 48210, "avatar": "https://pbs.twimg.com/…" } ] } ``` POST`/api/v1/offers`brand key Send a creator an offer. Returns `201`. Share `inviteUrl` with the creator if they're not on Transformer yet. | Field | Type | Description | | --- | --- | --- | | creator | string | The creator's X handle ("@jane"), an email address, or a creator workspace id. | | title | string | Short name for the offer. | | brief | string | Your note to the creator: what to say, what to avoid. | | url | string | The page to promote. The tracked link redirects here. | | deliverable | "post" \| "thread" \| "video" | What the creator publishes on X. | | quantity | integer | How many deliverables, 1–20. Default 1. | | payoutUsd | number | Fixed payout. The brand pays it when the creator accepts; it's held and released on verification. | | commissionPercent | number | Optional commission on reported sales, 0–50. Default 0. | | expiresInDays | integer | Days the creator has to accept, 1–90. Default 7. | Request ``` curl https://transformer.gg/api/v1/offers \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"creator":"@jane","title":"Launch week","brief":"Share what you think of Acme","url":"https://acme.com/launch","deliverable":"post","quantity":1,"payoutUsd":250,"commissionPercent":10}' ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "sent", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "x": "@jane", "email": null }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": null, "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": null, "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z" } } ``` GET`/api/v1/offers?status=sent`brand or creator key Offers this workspace sent (brand), or that were sent to this creator or its X handle, newest first. | Field | Type | Description | | --- | --- | --- | | status | string | Optional filter: sent, accepted, submitted, verified, paid, declined, cancelled, expired, or all. | Request ``` curl "https://transformer.gg/api/v1/offers?status=sent" \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "offers": [ { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "sent", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "x": "@jane", "email": null }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": null, "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": null, "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z" } ] } ``` GET`/api/v1/offers/{id}`brand or creator key One offer, including its tracked link once accepted, its submissions and its stats. Request ``` curl "https://transformer.gg/api/v1/offers/$OFFER_ID" \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "accepted", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "workspaceId": "c41a9e2d-7b6f-4a1e-9c3d-5e8f7a6b2c10", "name": "Jane Park", "x": "@jane" }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": "https://transformer.gg/r/k3v9x2", "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": "2026-10-25T15:40:03Z", "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z", "stats": { "clicks": 312, "conversions": 9, "revenueUsd": 441, "commissionUsd": 44.1, "verifiedPosts": 0 } } } ``` POST`/api/v1/offers/{id}/accept`creator key Accept an offer that's still `sent`. The response includes `trackedUrl`, the link to put in your post. Connect X first; your account must match the handle the offer was sent to. Request ``` curl -X POST https://transformer.gg/api/v1/offers/$OFFER_ID/accept \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "accepted", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "workspaceId": "c41a9e2d-7b6f-4a1e-9c3d-5e8f7a6b2c10", "name": "Jane Park", "x": "@jane" }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": "https://transformer.gg/r/k3v9x2", "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": "2026-10-25T15:40:03Z", "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z" } } ``` POST`/api/v1/offers/{id}/decline`creator key Decline an offer that's still `sent`. Request ``` curl -X POST https://transformer.gg/api/v1/offers/$OFFER_ID/decline \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "declined", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "x": "@jane", "email": null }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": null, "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": null, "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z" } } ``` POST`/api/v1/offers/{id}/cancel`brand key Cancel an offer that's `sent` or `accepted`. Request ``` curl -X POST https://transformer.gg/api/v1/offers/$OFFER_ID/cancel \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "cancelled", "paymentStatus": "unfunded", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "x": "@jane", "email": null }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": null, "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": null, "verifiedAt": null, "createdAt": "2026-10-25T14:02:11Z" } } ``` POST`/api/v1/offers/{id}/submissions`creator key Submit a post you published on X yourself (Transformer never posts for you). It's checked on X: it must be public, from the creator's own account, and contain everything in the offer's `mustInclude` (its `postLink` and the disclosure), carry X's Paid partnership label, plus a video for `video` offers. If it can't be verified you get a `422` whose `error` says why, and the submission is kept as `rejected`. | Field | Type | Description | | --- | --- | --- | | url | string | The URL of a post on X from your connected account. | Request ``` curl https://transformer.gg/api/v1/offers/$OFFER_ID/submissions \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"https://x.com/jane/status/123"}' ``` Response ``` { "offer": { "id": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "status": "verified", "paymentStatus": "released", "title": "Launch week", "brief": "Share what you think of Acme", "url": "https://acme.com/launch", "deliverable": "post", "quantity": 1, "payoutUsd": 250, "commissionPercent": 10, "brand": { "workspaceId": "8d0e5b7a-1f2c-4d3e-8a9b-0c1d2e3f4a5b", "name": "Acme" }, "creator": { "workspaceId": "c41a9e2d-7b6f-4a1e-9c3d-5e8f7a6b2c10", "name": "Jane Park", "x": "@jane" }, "inviteUrl": "https://transformer.gg/claim/9QxW2mLr7Tq", "trackedUrl": "https://transformer.gg/r/k3v9x2", "landingUrl": "https://acme.com/x/jane", "postLink": "https://acme.com/x/jane", "mustInclude": [ "https://acme.com/x/jane", "#ad" ], "submissions": [ { "id": "e19b3c7d-2a4f-4b8e-9d1c-6f0a5e2b7c84", "url": "https://x.com/jane/status/123", "status": "verified", "note": "Verified on X.", "createdAt": "2026-10-25T16:05:40Z", "verifiedAt": "2026-10-25T16:05:41Z" } ], "expiresAt": "2026-11-08T14:02:11Z", "acceptedAt": "2026-10-25T15:40:03Z", "verifiedAt": "2026-10-25T16:05:41Z", "createdAt": "2026-10-25T14:02:11Z" } } ``` POST`/api/v1/visits`brand key Record a visit to a brand's own per-creator landing page, server-side. It counts as a click on the offer. Returns `201` with a `clickId`: keep it in the visitor's session and send it to `POST /conversions` when they sign up or buy. `404` if there's no live offer to that handle. Repeat visits from the same visitor are deduplicated (`duplicate: true`). | Field | Type | Description | | --- | --- | --- | | handle | string | The creator's X handle, e.g. from your /x/{handle} landing page (with or without @, any case). Uses your latest live offer to them. | | offerId | string | Instead of handle, when you know the offer. | | clickId | string | Optional. The tf_click query value if the visitor came through the tracked /r link: that click is reused, not counted twice. | | url | string | Optional. The landing page URL. | | ip | string | Optional. The visitor's IP, hashed for deduplication and never stored. | | userAgent | string | Optional. Bots are not counted. | | referrer | string | Optional. | Request ``` curl https://transformer.gg/api/v1/visits \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"handle":"jane","ip":"203.0.113.7","userAgent":"Mozilla/5.0 …","referrer":"https://t.co/abc"}' ``` Response ``` { "recorded": true, "duplicate": false, "clickId": "b2e7d4a1-5c3f-4e8a-9d61-7a0c2f9e8b14", "offerId": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90" } ``` POST`/api/v1/conversions`brand key Report a sale or signup (send `amountUsd: 0` for a signup) that came from a creator's link. Returns `201`; `duplicate` is true if that order was already reported. Call it from your backend; see conversion tracking. | Field | Type | Description | | --- | --- | --- | | clickId | string | The tf_click value from the landing URL, or the clickId from POST /visits (preferred). | | handle | string | The creator's X handle. Used when there's no clickId, or as a fallback if the clickId is unknown. Uses your latest live offer to them. | | offerId | string | Instead of clickId, when the sale can't be tied to a click. | | amountUsd | number | Order value the commission is calculated on. | | orderId | string | Your order id. Reporting the same order twice is a no-op. | Request ``` curl https://transformer.gg/api/v1/conversions \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"clickId":"b2e7d4a1-5c3f-4e8a-9d61-7a0c2f9e8b14","amountUsd":49.00,"orderId":"A-1001"}' ``` Response ``` { "recorded": true, "duplicate": false, "offerId": "3f6c1a2e-8b1d-4c3e-9a57-2d0b6f1e4c90", "amountUsd": 49, "commissionUsd": 4.9, "stats": { "clicks": 312, "conversions": 9, "revenueUsd": 441, "commissionUsd": 44.1, "verifiedPosts": 1 } } ``` GET`/api/v1/offers/{id}/stats`brand or creator key Clicks on the tracked link, reported conversions, revenue, commission and verified posts for an offer. Request ``` curl "https://transformer.gg/api/v1/offers/$OFFER_ID/stats" \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" ``` Response ``` { "stats": { "clicks": 312, "conversions": 9, "revenueUsd": 441, "commissionUsd": 44.1, "verifiedPosts": 1 } } ``` ### Conversion tracking With the tracked `/r/…` link, attribution takes three small pieces on the brand's side: the click id travels in the URL, and you report the sale from your server. With your own per-creator landing pages, see below. #### 1. Read tf_click on your site Visitors from a tracked link land on your offer `url` with `?tf_click=…` appended. Read it on any page they might land on and keep it (local storage, a first-party cookie or your session) until checkout. browser ``` // On every landing page: keep the click id from the tracked link. const tfClick = new URLSearchParams(location.search).get("tf_click"); if (tfClick) localStorage.setItem("tf_click", tfClick); // At checkout: send it with the order to your own backend. await fetch("/checkout", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ cart, tfClick: localStorage.getItem("tf_click") }), }); ``` #### 2. Store it with the order Save the `tf_click` value on the order record when it's created, the same way you'd keep a coupon code. #### 3. Report the conversion server-side When the order is paid, call `POST /api/v1/conversions` with a brand key. Use your own order id so a retry never double-counts. server ``` // On your server, once the order is paid (store tfClick with the order first). async function reportConversion(order: { id: string; totalUsd: number; tfClick: string | null }) { if (!order.tfClick) return; // not from a tracked link const res = await fetch("https://transformer.gg/api/v1/conversions", { method: "POST", headers: { Authorization: `Bearer ${process.env.TRANSFORMER_API_KEY}`, // brand workspace key "Content-Type": "application/json", }, body: JSON.stringify({ clickId: order.tfClick, amountUsd: order.totalUsd, orderId: order.id }), }); if (!res.ok) throw new Error((await res.json()).error); } ``` Agents can do the same with the `report_conversion` MCP tool or `transformer conversions report --click --amount 49 --order A-1001`. #### Per-creator landing pages If creators post a link to your own page (e.g. `https://acme.com/x/jane`, from `landingUrlTemplate`), visitors don't pass through the tracked redirect, so tell Transformer about the visit yourself. On the server that renders `/x/:handle`: server ``` // GET /x/:handle — record the visit, keep the clickId for the signup. const res = await fetch("https://transformer.gg/api/v1/visits", { method: "POST", headers: { Authorization: `Bearer ${process.env.TRANSFORMER_API_KEY}`, // brand workspace key "Content-Type": "application/json", }, body: JSON.stringify({ handle: req.params.handle, clickId: req.query.tf_click, ip: req.ip, userAgent: req.get("user-agent"), referrer: req.get("referer") }), }); if (res.ok) req.session.tfClick = (await res.json()).clickId; ``` Then report the signup or sale with that `clickId`. If you didn't keep it, send the creator's `handle` instead: signup ``` curl https://transformer.gg/api/v1/conversions \ -H "Authorization: Bearer $TRANSFORMER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"clickId":"b2e7d4a1-5c3f-4e8a-9d61-7a0c2f9e8b14","amountUsd":0,"orderId":"signup-8812"}' ## or, without a clickId: -d '{"handle":"jane","amountUsd":0,"orderId":"signup-8812"}' ``` #### Pixel No server code? Put a 1×1 pixel on the landing page instead. Each load counts as a visit to that creator's live offer (bots and link previews aren't counted). Use your brand workspace's slug and the creator's handle: landing page (HTML) ``` ``` The pixel only counts visits. Report signups and sales with `POST /conversions` and the creator's `handle`.