이 MCP로 할 수 있는 일
Provides CRM capabilities for managing contacts, deals, email, advertising, and reports.
도구
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['id'], 'properties': {'id': {'type': 'string', 'pattern': '\\S', 'minLength': 1, 'description': 'Opaque profile identifier, unique within Plyto and unchanged across token refresh, reconnection, and display-metadata changes. Never reassigned to another profile.'}, 'name': {'type': 'string', 'description': 'Display name for the signed-in person.'}, 'email': {'type': 'string', 'description': 'Email address for display; not used as the profile identity.'}, 'nickname': {'type': 'string', 'description': 'The business this connection manages, to tell connections apart.'}}, 'additionalProperties': False}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['adSetId', 'dailyMinDollars'], 'properties': {'adSetId': {'type': 'string', 'minLength': 1, 'description': "The ad set (ads.campaign.get lists each campaign's ad sets with ids)."}, 'confirm': {'type': 'boolean', 'description': 'Set true only after the user said to set this floor. Without it the tool says what the floors add up to against the campaign budget and changes nothing.'}, 'dailyMinDollars': {'type': 'number', 'maximum': 10000, 'minimum': 0, 'description': 'The least Meta should spend on this ad set each day, in dollars. 0 removes the floor.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['adSetId', 'to'], 'properties': {'to': {'enum': ['live', 'paused'], 'type': 'string', 'description': 'live turns the ad set on; paused stops it. Its ads keep their own states.'}, 'adSetId': {'type': 'string', 'minLength': 1, 'description': "The ad set (ads.campaign.get lists each campaign's ad sets with ids)."}, 'confirm': {'type': 'boolean', 'description': 'Set true only after the user said to turn this ad set on or off. Without it the tool says what would start or stop spending and changes nothing.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign whose ads to list.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['assetId'], 'properties': {'assetId': {'type': 'string', 'minLength': 1, 'description': 'The creative asset to delete permanently.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'type': {'enum': ['image', 'video', 'audio'], 'type': 'string', 'description': 'Filter by asset type. Omit for all.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['userAskedToCreate', 'name'], 'properties': {'name': {'type': 'string', 'maxLength': 100, 'minLength': 2, 'description': 'Name for the new audience, as it will appear in Meta.'}, 'country': {'type': 'string', 'default': 'US', 'maxLength': 2, 'minLength': 2, 'description': 'Two-letter country code the lookalike is built in.'}, 'fromListId': {'type': 'string', 'description': 'Build a custom audience from this Plyto contact list (emails are hashed before upload). Use crm.list.* tools to find the id.'}, 'lookalikePercent': {'type': 'number', 'default': 1, 'maximum': 10, 'minimum': 1, 'description': "Lookalike breadth as a percent of the country's population. 1 is the closest match and usually performs best; 10 is broadest."}, 'userAskedToCreate': {'type': 'boolean', 'description': 'True only if the user explicitly asked you to build this audience on Meta. Discussing who to target, or being asked what audiences exist, is not asking you to create one. If you are unsure, it is false: ask them first.'}, 'lookalikeOfAudienceId': {'type': 'string', 'description': 'Build a lookalike seeded from this existing Meta audience id (from ads.audience.list).'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 80, 'minLength': 2, 'description': "What to search for, e.g. 'home improvement' or 'yoga'."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'refresh': {'type': 'boolean', 'default': False, 'description': 'Re-pull from Meta instead of using the cached list. Use when the user just created an audience elsewhere.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'days': {'type': 'integer', 'default': 30, 'maximum': 90, 'minimum': 1, 'description': "How far back to look. Google's own history covers 30 days at most."}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign whose history to read.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Must be true to actually delete. Call WITHOUT it first: the tool returns what would be deleted so you can confirm with the user. Set true only after the user has approved deleting THIS campaign by name in this conversation.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The draft campaign to delete.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'objective', 'dailyBudgetCents'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Campaign name shown in dashboards.'}, 'notAFit': {'type': 'string', 'maxLength': 300, 'minLength': 3, 'description': 'ChatGPT Ads only, and expected on every ChatGPT draft: who asks ChatGPT about this topic but will never pay, so the ads stay out of their conversations. One sentence, e.g. "students and school assignments, job seekers, anyone after a free template". Leave these people out of audienceDescription too; a profile that lists students beside founders is describing users, not buyers.'}, 'metaGoal': {'enum': ['conversions', 'landing_page_views'], 'type': 'string', 'description': "Meta only: what the ad sets aim for. Omitted = conversions (the objective's own event, a Lead for OUTCOME_LEADS). landing_page_views = aim for people who reach the page, the right start for an account whose pixel has recorded no conversions yet or when the owner asks for visits first; switch back later with ads.meta.goal.set once conversions come in."}, 'locations': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 25, 'description': 'Where the ads run. For a local business list the places, e.g. ["Denver, Colorado"] or ["Mesa, Arizona", "Gilbert, Arizona"], taken from the owner\'s words, their website, or the area code of their phone. Omitted, targeting defaults to the business\'s own country (from its profile, else United States), which is right only for a business that sells nationwide. Writing the geography into audienceDescription does NOT target it.'}, 'objective': {'enum': ['OUTCOME_SALES', 'OUTCOME_LEADS', 'OUTCOME_TRAFFIC', 'OUTCOME_AWARENESS', 'OUTCOME_ENGAGEMENT'], 'type': 'string', 'description': 'Campaign objective. OUTCOME_SALES is the typical default for paid conversion campaigns.'}, 'platforms': {'type': 'array', 'items': {'enum': ['meta', 'google', 'openai', 'tiktok'], 'type': 'string'}, 'default': ['meta'], 'minItems': 1, 'description': 'Platforms to draft a campaign on; one campaign row per platform, EACH with the full dailyBudgetCents (two platforms is twice the spend). A first draft is ONE platform unless the owner named two: Google for a service people search for when they need it, Meta for one they discover. "openai" is ChatGPT Ads: a small card under a ChatGPT answer (square picture, title up to 50 characters, one line of body up to 100). "tiktok" is TikTok Ads: an in-feed vertical video (9:16) with one line of text up to 100 characters; the campaign needs at least 50 a day in the account\'s currency.'}, 'radiusMiles': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Radius around each city, in miles. Typical local service business: 15 to 25.'}, 'contextHints': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300, 'minLength': 3}, 'maxItems': 50, 'description': 'ChatGPT Ads only: plain sentences describing the conversations these ads belong in, e.g. "Finding a plumber for a burst pipe at night", "Comparing water heater replacement costs". Not keywords, and never places (geography is targeted separately). Omitted, they are written from the audience and the brand profile at launch.'}, 'contactListId': {'type': 'string', 'description': 'Target an existing CRM list instead of a described audience: at launch the list is pushed to Meta as a hashed-email Custom Audience (find ids via crm.lists.list). Provide EITHER this OR audienceDescription.'}, 'dailyBudgetCents': {'type': 'integer', 'maximum': 9007199254740991, 'description': "Daily budget in hundredths of the business's own currency: the connected ad account's, else its country's (INR for India, GBP for the UK, USD for the US). 5000 is $50 a day for a US business; 200000 is ₹2,000 a day for an Indian one. Never convert to dollars; the result says the currency it was saved in.", 'exclusiveMinimum': 0}, 'audienceDescription': {'type': 'string', 'maxLength': 2000, 'minLength': 1, 'description': "Who the ads should reach, in one or two plain sentences (the trade's customers, where they are, what they are dealing with); translated into platform targeting at launch. Always pass it unless contactListId is used: take it from the brand profile's audience when the owner gave nothing more specific. Omitted, the profile's audience is used; with no audience on file the call fails and you must ask."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign to read (an id from ads.campaign.list).'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The DRAFT campaign to launch.'}, 'confirmLaunch': {'type': 'boolean', 'description': 'REQUIRED true to launch. Set it only after the user explicitly said to launch THIS campaign at the daily budget the first call reported. Never on the same turn the campaign was drafted.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1}, 'status': {'type': 'array', 'items': {'enum': ['draft', 'pending_launch', 'launching', 'live', 'paused', 'archived', 'failed'], 'type': 'string'}, 'description': 'Filter by status. Omit to get all statuses.'}, 'platforms': {'type': 'array', 'items': {'enum': ['meta', 'google', 'linkedin', 'openai', 'tiktok'], 'type': 'string'}, 'description': 'Filter by platforms. Omit for all.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign to inspect.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'locationNames'], 'properties': {'presence': {'enum': ['presence', 'presence_or_interest'], 'type': 'string', 'description': 'Google only. "presence" = people in or regularly in the places (the right choice almost always: it stops searchers in other countries seeing the ads). "presence_or_interest" is Google\'s default and also reaches anyone anywhere who shows interest in the place. Leave unset to keep the campaign\'s current setting.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign whose targeting to set.'}, 'radiusMiles': {'anyOf': [{'type': 'number', 'maximum': 500, 'minimum': 1}, {'type': 'null'}], 'description': 'Optional radius around each place, for local businesses.'}, 'locationNames': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 30, 'minItems': 1, 'description': 'Plain place names: cities, regions, or countries ("United States", "Toronto", "England"). Replaces the campaign\'s current locations on every ad group. Pass every place the owner named, each by its own name: a radius around the bigger ones does not reach the towns between them, so never say it covers a place you left out.'}, 'confirmLiveEdit': {'type': 'boolean', 'description': 'REQUIRED true for a LIVE or paused campaign: the change reaches Google or Meta immediately. Set true only after the user explicitly asked to change where this campaign runs.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'One launched campaign. Omit to check every launched campaign in the business.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'to'], 'properties': {'to': {'enum': ['paused', 'live'], 'type': 'string', 'description': '"paused" stops spend on the platform; "live" resumes it.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'A LIVE or PAUSED campaign.'}, 'confirmResume': {'type': 'boolean', 'description': 'REQUIRED true when to is "live": resuming restarts spend. Set only after the user explicitly asked to resume this campaign.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'name': {'type': 'string', 'maxLength': 150, 'minLength': 1}, 'adSetId': {'type': 'string', 'description': 'Which ad group (ad set) the audience/keyword change targets. Campaigns can have several ad groups, each with its own keyword theme; ads.campaign.get lists them with ids. Defaults to the first ad group.'}, 'notAFit': {'type': 'string', 'maxLength': 300, 'minLength': 3, 'description': 'ChatGPT campaigns only: who asks ChatGPT about this topic but will never pay (students, job seekers, people after a free template). Becomes the last context hint at launch.'}, 'objective': {'enum': ['OUTCOME_LEADS', 'OUTCOME_SALES', 'OUTCOME_TRAFFIC', 'OUTCOME_AWARENESS'], 'type': 'string'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign to edit.'}, 'contextHints': {'type': 'array', 'items': {'type': 'string', 'maxLength': 300, 'minLength': 3}, 'maxItems': 50, 'description': "ChatGPT campaigns only: replaces the ad group's context hints (plain sentences describing the conversations the ads belong in)."}, 'googleKeywords': {'type': 'array', 'items': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'maxItems': 25, 'description': "Search keywords (google campaigns only). Cover EVERY intent in the audience description: when it names competitors or 'alternatives to X', include those alternative/competitor keywords (e.g. 'gohighlevel alternative'), not just generic category terms."}, 'dailyBudgetDollars': {'type': 'number', 'maximum': 100000000, 'minimum': 1, 'description': "Daily budget in whole units of the campaign's own currency (dollars for a US business, rupees for an Indian one, as the draft result named it). Never converted."}, 'audienceDescription': {'type': 'string', 'maxLength': 2000, 'description': "Plain-English audience; replaces the first ad set's audience."}, 'confirmSpendIncrease': {'type': 'boolean', 'description': "REQUIRED true when raising the budget of a live campaign. Only set after the user explicitly approved the new amount in chat. Never state a live campaign's current budget from memory: call without this flag first, and the reply carries the figure the ad platform reports right now."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'headline', 'body'], 'properties': {'body': {'type': 'string', 'maxLength': 2000, 'minLength': 1}, 'ctaType': {'enum': ['LEARN_MORE', 'SIGN_UP', 'GET_QUOTE', 'SHOP_NOW', 'CONTACT_US', 'BOOK_NOW', 'CALL_NOW'], 'type': 'string', 'default': 'LEARN_MORE', 'description': "The button. BOOK_NOW for anything a person books a time for (dentists, clinics, med spas, salons, consultations); GET_QUOTE for trades and estimates; CALL_NOW only for an emergency trade whose next step is a call; SIGN_UP only for an account or a list. An appointment business's SIGN_UP or GET_QUOTE is corrected to BOOK_NOW."}, 'message': {'type': 'string', 'maxLength': 40, 'description': 'The message this ad carries when the campaign tests several against each other ("The CRM", "AI ads management", "Spring offer"): two to four words, the same label on every variation of that message, so the campaign page can line messages up across audiences.'}, 'headline': {'type': 'string', 'maxLength': 255, 'minLength': 1}, 'campaignId': {'type': 'string', 'minLength': 1}, 'adGroupName': {'type': 'string', 'maxLength': 200, 'description': "For campaigns with several ad groups: a fragment of the ad group's name to add the ad into. Defaults to the first ad group."}, 'pictureLine': {'type': 'string', 'maxLength': 40, 'description': 'Meta and ChatGPT: the words baked into the picture. Meta: 3 to 7 words, the hook a stranger stops for ("Tired of chasing quotes?", "Leaking roof? Fixed this week."), different from the headline (the promise Meta shows under the picture) and from the body\'s first sentence: three zones, three sentences. ChatGPT: REQUIRED, up to 5 words and 32 characters, the one phrase drawn on the card thumbnail beside the logo ("See which slides they read"); never a question, never the title again.'}, 'destinationUrl': {'type': 'string', 'maxLength': 1000}, 'confirmLiveEdit': {'type': 'boolean', 'description': "Required to add an ad to a LAUNCHED campaign. Google: the ad reaches Google immediately. Meta: the ad is saved as a draft inside the launched campaign's ad set; give it an image, then ads.meta.ads.publish puts it on Meta. Omit for draft campaigns. Set true only after the user explicitly asked to add ads to that specific campaign."}, 'destinationSource': {'enum': ['user'], 'type': 'string', 'description': 'Set to "user" ONLY when the owner typed this exact URL in this conversation. Otherwise omit: the link must be on the website on file or a Plyto-hosted page, and the tool refuses anything else.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['adCreativeId', 'assetId'], 'properties': {'assetId': {'type': 'string', 'minLength': 1, 'description': 'The creative-library image or video clip to attach (from ads.creative.generate_images, ads.creative.generate_video or the library).'}, 'adCreativeId': {'type': 'string', 'minLength': 1, 'description': "The ad to attach the image to (from the campaign's ads list)."}, 'replaceOwnerPhoto': {'type': 'boolean', 'description': 'Only when the owner asked in so many words for a generated picture in place of the photo of theirs this ad shows.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['assetId', 'headline'], 'properties': {'name': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'ratios': {'type': 'array', 'items': {'enum': ['1:1', '4:5', '9:16', '16:9'], 'type': 'string'}}, 'assetId': {'type': 'string', 'minLength': 1, 'description': 'A REAL photo from the library: its assetId from ads.assets.list or websites.photos (its url works too). Uploaded by the owner or saved from their website. Never a generated image.'}, 'subline': {'type': 'string', 'maxLength': 110}, 'headline': {'type': 'string', 'maxLength': 90, 'minLength': 3, 'description': "Composited in real type under the photo. Always the ad's headline."}, 'adCreativeId': {'type': 'string', 'description': 'Draft ad to auto-attach the 1:1 to. One call per ad.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'name': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'layout': {'enum': ['complete', 'statement', 'screenshot', 'offer'], 'type': 'string', 'description': 'complete: the product ad, and the layout for EVERY ad in a set with a real product image. The headline\'s lead in ink and its last phrase (accentPhrase) in the brand color, the mechanism line, then the ONE part of the real product image that proves the headline (a form, a card of data, a chart), cropped so it reads and floating on a light field with a drawn line pointing into it, and the real logo under it. The product image is found automatically (the newest product screen or site capture in the library, or pass heroAssetId) and the part shown is picked for the headline (steer it with heroFocus). When the image holds no part of the product (a homepage fold of headline and buttons), the ad is drawn as a statement instead and the note says so. statement: the type is the ad. A light field, the headline\'s lead in ink and its last phrase (accentPhrase, or the last sentence) in white on a block of the brand color, one line under it, the ad\'s own button as a pill, the real logo; no band, no tiles. Write the headline as two short sentences when you can ("You run the business. AI runs the ads."): the second one goes on the block. The layout for every ad without a real product image or photo, and the one to reach for when the message is one strong sentence. Variety across a set comes from the message and the accent phrase (and on the product layout the part shown), never from switching one ad to a weaker layout. screenshot: an older plain composition; do not use it unless asked by name. offer: a flat typographic poster on the solid brand color; only when the person asks for a poster, or the campaign is a price offer and the library has no product image. A mention of a free plan in the body does not make an ad an offer poster. Icon lockups are retired.'}, 'ratios': {'type': 'array', 'items': {'enum': ['1:1', '4:5', '9:16', '16:9'], 'type': 'string'}}, 'subline': {'type': 'string', 'maxLength': 110, 'description': 'The mechanism line under the headline: how it works, with the concrete nouns (services, platforms, city, season). Up to 12 words.'}, 'ctaLabel': {'type': 'string', 'maxLength': 24, 'description': "statement layout: the painted button text. Defaults to the attached ad's own call to action so the picture and the real button agree; never a second, different action."}, 'headline': {'type': 'string', 'maxLength': 90, 'minLength': 3, 'description': "The line set in real type: 3 to 8 words in the buyer's own words, with one specific. Required unless revisionOf is set."}, 'heroFocus': {'type': 'string', 'maxLength': 80, 'description': 'complete layout: which part of the product image to show, in words ("the revenue chart", "the booking form"). Leave unset to show the part that best proves the headline.'}, 'proofTiles': {'type': 'array', 'items': {'type': 'string', 'maxLength': 28, 'minLength': 2}, 'maxItems': 3, 'description': 'statement layout: short proof lines ("Licensed and insured", "12 years in Bend"); the first is drawn beside the button. Each must come from the brand profile\'s claims or value proposition, the website scan, or the person\'s own words; the tool refuses any it cannot find on file. The product layout draws none: the product is the proof.'}, 'revisionOf': {'type': 'string', 'description': 'EDITING an existing designed graphic: the asset id of any size in the set (the library card names it). Everything not passed is kept from it: headline, accent phrase, mechanism line, proof line, button, product image and the part of it shown, layout and name. The old set is archived out of the library and any ad using it switches to the new one, so a change never leaves two versions behind. Pass only the fields that change.'}, 'heroAssetId': {'type': 'string', 'description': 'complete and screenshot layouts: a library image asset (a real product screenshot, the site capture, or a real photo) to show. Use ads.assets.list to find one; never fabricate UI.'}, 'accentPhrase': {'type': 'string', 'maxLength': 40, 'description': 'The phrase that ENDS the headline, set apart in the brand color (on the product layout in colored type, on the statement on a block of the color). "Know which ads make money." with accentPhrase "make money."'}, 'adCreativeId': {'type': 'string', 'description': 'Draft ad to auto-attach the 1:1 to. The set it replaces is archived out of the library.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['hook'], 'properties': {'cta': {'type': 'string', 'maxLength': 24, 'description': 'Button label on the closing card, e.g. "Get a quote", "Book now", "Start free". Default "Learn more".'}, 'hook': {'type': 'string', 'maxLength': 80, 'minLength': 3, 'description': "The one line shown large over the first two to three seconds. The reason to keep watching, in the customer's words: a pain, a promise or a question. Under 60 characters reads best."}, 'name': {'type': 'string', 'maxLength': 60, 'description': 'Library name for the finished ad.'}, 'aspect': {'enum': ['9:16', '16:9', '1:1'], 'type': 'string', 'default': '9:16', 'description': '9:16 for Reels, Stories and TikTok (the default). 16:9 for feed and YouTube. 1:1 for square feed.'}, 'assetIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 4, 'minItems': 1, 'description': 'Library clips and images IN ORDER (1 to 4). Clips play up to 12 seconds each; images hold for a few seconds with a slow push-in. Omit to use the newest generated clips (up to 3) that are not already a finished ad.'}, 'captions': {'type': 'array', 'items': {'anyOf': [{'type': 'string', 'maxLength': 90}, {'type': 'null'}]}, 'maxItems': 4, 'description': 'One short caption per clip, in the same order as assetIds (null to leave a clip clean). Lower third, one idea each.'}, 'muteClips': {'type': 'boolean', 'description': "Drop the clips' own sound."}, 'noEndCard': {'type': 'boolean', 'description': 'Skip the closing brand card.'}, 'endSubline': {'type': 'string', 'maxLength': 110, 'description': "Supporting line on the closing card. Default: the business's value proposition."}, 'clipSeconds': {'type': 'number', 'maximum': 12, 'minimum': 2, 'description': "Trim every clip to this many seconds. Default: each clip's own length, up to 12."}, 'endHeadline': {'type': 'string', 'maxLength': 70, 'description': 'Headline on the closing brand card. Default: the hook.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['creativeId'], 'properties': {'creativeId': {'type': 'string', 'minLength': 1, 'description': 'The ad (creative) to delete.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['adSetId', 'name', 'headline', 'body', 'destinationUrl', 'creativeAssetId'], 'properties': {'body': {'type': 'string', 'maxLength': 500, 'minLength': 1, 'description': 'Primary ad copy shown above the image. Keep it under 125 characters: Facebook hides the rest behind "See more" and Instagram shows even less. One idea, the hook first.'}, 'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Internal name shown in the dashboard.'}, 'adSetId': {'type': 'string', 'minLength': 1, 'description': 'ID of an existing ad set in this business (returned from ads.campaign.draft).'}, 'ctaType': {'enum': ['LEARN_MORE', 'SHOP_NOW', 'SIGN_UP', 'GET_QUOTE', 'CONTACT_US', 'SUBSCRIBE', 'BOOK_TRAVEL', 'DOWNLOAD', 'GET_OFFER', 'APPLY_NOW'], 'type': 'string', 'default': 'LEARN_MORE', 'description': 'Call-to-action button type.'}, 'headline': {'type': 'string', 'maxLength': 40, 'minLength': 1, 'description': "The line Meta shows under the picture (under 40 characters): the promise or the offer in the customer's words, with one specific. Never the same words as pictureLine or the body's first sentence."}, 'description': {'type': 'string', 'maxLength': 125, 'description': 'Optional secondary description shown under the headline.'}, 'pictureLine': {'type': 'string', 'maxLength': 40, 'description': 'Facebook only: the 3 to 7 words baked into the picture, the hook a stranger stops for ("Tired of chasing quotes?", "Leaking roof? Fixed this week."). Different from the headline and from the body\'s first sentence: three zones, three sentences. Without it the picture repeats the headline.'}, 'destinationUrl': {'type': 'string', 'format': 'uri', 'description': 'Where the ad clicks land (your website, landing page, etc.).'}, 'creativeAssetId': {'type': 'string', 'minLength': 1, 'description': 'ID of an uploaded creative asset (image) for this business. Use ads.assets.list to find one.'}, 'destinationSource': {'enum': ['user'], 'type': 'string', 'description': 'Set to "user" ONLY when the owner typed this exact URL in this conversation. Otherwise omit: the link must be on the website on file or a Plyto-hosted page, and the tool refuses anything else.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['assetId', 'instruction'], 'properties': {'assetId': {'type': 'string', 'minLength': 1, 'description': "The owner's photo to edit: its assetId from ads.assets.list (an upload, a photo saved from their website, or an earlier edit; its url works too). Never a generated picture or an ad graphic: for an ad made from a photo, edit the photo it was made from."}, 'instruction': {'type': 'string', 'maxLength': 500, 'minLength': 3, 'description': 'The change, in the owner\'s words: what to take out or change ("remove the coffee table and the rugs", "clear the clutter off the counter", "make the background plain white"). Everything else in the photo stays as it is.'}, 'adCreativeIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 10, 'description': 'Draft ads to put the edited photo on once it passes the check: each becomes a photo ad from the edit, as ads.creative.compose_from_photo makes.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title'], 'properties': {'sizes': {'type': 'array', 'items': {'enum': ['social', 'story', 'print'], 'type': 'string'}, 'maxItems': 3, 'minItems': 1, 'description': 'social is 4:5 for a feed post, story is 9:16, print is US letter at 300 dpi. Default: social and print.'}, 'title': {'type': 'string', 'maxLength': 80, 'minLength': 3, 'description': "The big line, in the owner's words: what the flyer is about ('Monday Upland Training Days', 'Grand opening this Saturday')."}, 'kicker': {'type': 'string', 'maxLength': 40, 'description': "A short line above the title: when, or for whom ('Every Monday this fall', 'Now booking weddings')."}, 'contact': {'type': 'array', 'items': {'type': 'string', 'maxLength': 70, 'minLength': 3}, 'maxItems': 3, 'description': 'How to reach them: a phone number, an email, a website, an address. Omit to use the phone and website on file.'}, 'details': {'type': 'array', 'items': {'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 140, 'minLength': 1}, 'label': {'type': 'string', 'maxLength': 18, 'description': 'One or two words: When, Where, Includes, Drop-off, Price.'}}}, 'maxItems': 6, 'description': "The facts, one per row, in the owner's words: dates and times, the place, what is included, how it works. Never a fact they did not give, and never a line the kicker or subtitle already says."}, 'subtitle': {'type': 'string', 'maxLength': 180, 'description': 'One or two sentences under the title: the promise, or why it is worth coming.'}, 'accentPhrase': {'type': 'string', 'maxLength': 40, 'description': 'The words that END the title, set in the brand color. Omit and the last line takes it.'}, 'photoAssetId': {'type': 'string', 'description': "A real photo from the library for the top of the flyer (its id from ads.assets.list, websites.photos or the owner's upload message). Never a screenshot or a document."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['prompt'], 'properties': {'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Base name for the set shown in the library (e.g. "Summer promo"). Defaults to a prompt excerpt.'}, 'style': {'enum': ['photo', 'illustration', 'graphic'], 'type': 'string', 'description': 'Visual treatment. photo (default): photorealistic scene, best for trades and local services. graphic: bold designed flat graphic with shapes and brand color, best for SaaS and offers. illustration: hand-drawn feel. Only change from photo when the user asks for a designed/graphic/illustrated look.'}, 'prompt': {'type': 'string', 'maxLength': 2000, 'minLength': 5, 'description': 'The scene, briefed like an art director, not a category label. Brand profile (name, industry, audience, voice, colors) is added automatically; don\'t repeat it.\n\nSHOW THE WORK OR THE RESULT. Name the actual service and show it happening: hands on the thing, the tool mid-use, the damaged part next to the repaired part. A buyer decides in half a second whether you do what they need, and they decide from the picture.\n\nNEVER BRIEF THESE. They are what a model reaches for when a brief is vague, and they say nothing: a handshake, a crew \'greeting\' or \'meeting\' a customer, a team lined up smiling at camera, arms folded in front of a van, a thumbs up, someone pointing at a clipboard, a family beaming in an empty living room. If your brief contains the words greeting, meeting, welcoming, consulting or discussing, rewrite it around the work itself.\n\nNO TEXT IN THE SCENE, EVER. Never brief words, labels, captions, numbers, logos, UI screens with readable text, or labeled diagrams/infographics (\'a funnel with LEAD and DEAL stages\'). Painted lettering always fails quality review — three failures per concept, then the image collapses to a plain template tile. The real headline and logo are composited in actual type afterward; pass them via the headline field.\n\nBE SPECIFIC AND TRUE. Match the exact service in the campaign: siding repair is a hand fitting a board, not a roof. Include the material, the weather, the time of day, the wear on the tools. Working clothes and real mess beat clean and posed, which reads as AI and gets distrusted.\n\nTRADES SAFETY. If the scene has height or hazard, brief the correct gear, because a contractor\'s ad showing unsafe work is a liability image: harness and rope on a pitched roof, a footed and tied-off ladder, gloves, eye protection, hard hat on a site.\n\nGOOD: "A siding installer kneeling on a drop cloth, fitting a fresh fibre-cement board into a gap where storm-damaged siding was cut away, nail gun in hand, the old cracked boards stacked beside him, overcast morning light." BAD: "A roofing crew greeting a homeowner."'}, 'ratios': {'type': 'array', 'items': {'enum': ['1:1', '4:5', '9:16', '16:9'], 'type': 'string'}, 'description': 'Placement sizes to generate. Defaults to all four. 1:1 is required and always included.'}, 'subline': {'type': 'string', 'maxLength': 120, 'description': 'The mechanism line under the headline: one sentence, under 60 characters, saying what happens ("Free inspection, repairs the same week."). The proof tiles under it come from the claims and value proposition on file, so say something they do not. Optional.'}, 'headline': {'type': 'string', 'maxLength': 90, 'description': "The words baked into the picture in real type (with the real logo): the ad's pictureLine, the 3 to 7 word hook, never the headline Meta shows under the picture, so the ad's three zones say three different things. An ad with a pictureLine on file supplies it automatically; pass this only to override. Always give the picture some words: a brand-template fallback without them is just a colored background."}, 'adCreativeId': {'type': 'string', 'description': "A draft ad to attach the generated 1:1 to automatically. When generating for a campaign's ads, call once PER AD with each ad's id so every image lands on its ad without a separate attach step. Also supplies the composited headline when you don't pass one."}, 'sceneRequested': {'type': 'boolean', 'description': 'Only when the owner asked for a photographed or painted scene in so many words. A software business with its product screen on file otherwise gets the designed graphic (ads.creative.compose_graphic) instead of a scene, because painted software scenes fail review on the lettering the model puts on screens.'}, 'replaceOwnerPhoto': {'type': 'boolean', 'description': "Only when the owner asked in so many words for an AI picture in place of the photo of theirs this ad shows. Without it, an ad that shows the owner's own photo is never painted over."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['prompt'], 'properties': {'cta': {'type': 'string', 'maxLength': 24, 'description': 'Button label on the closing brand card, e.g. "Get a quote", "Start free". Default "Learn more".'}, 'hook': {'type': 'string', 'maxLength': 80, 'description': 'The one line shown over the opening seconds of the FINISHED ad. Pass it whenever the clip is for an ad (it almost always is): the moment the clip lands, Plyto composes the finished ad with this hook, the caption and the brand end card, and that is what the person sees. Leave it out only for raw footage someone asked for by name.'}, 'name': {'type': 'string', 'maxLength': 60, 'description': 'Library name for the clip.'}, 'engine': {'enum': ['veo', 'omni'], 'type': 'string', 'description': 'Leave unset: the workspace default renders. Only when the person names the engine (a side-by-side of Veo against Gemini Omni Flash).'}, 'prompt': {'type': 'string', 'maxLength': 1200, 'minLength': 8, 'description': 'What happens in the clip: shot type, subject, action, setting, light. One continuous moment, one subject. Describe the SCENE only. No words, captions, logos or brand names in frame: the headline and CTA come from the ad copy.'}, 'caption': {'type': 'string', 'maxLength': 90, 'description': 'One lower-third line for the clip in the finished ad.'}, 'aspectRatio': {'enum': ['9:16', '16:9'], 'type': 'string', 'default': '9:16', 'description': '9:16 for Reels, Stories and TikTok-style placements. 16:9 for feed and YouTube.'}, 'fromAssetId': {'type': 'string', 'description': "A library IMAGE to open on: a real photo of the place or product beats an invented scene. When the person attached photos, pick the clearest product or place shot YOURSELF and render; never ask them which. Only this starting image is face-checked: a photo with a person's face in it is refused, so pick one of the place, the work or the product."}, 'durationSeconds': {'anyOf': [{'type': 'number', 'const': 4}, {'type': 'number', 'const': 6}, {'type': 'number', 'const': 8}], 'default': 8, 'description': 'Clip length. 8 suits most ads; 4 for a single beat; 6 in between.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['creativeId'], 'properties': {'body': {'type': 'string', 'description': 'New description (Google, 90 characters) or primary text (Meta).'}, 'message': {'type': 'string', 'maxLength': 40, 'description': 'The message this ad carries in a test of several ("The CRM", "AI ads management"): two to four words, the same on every variation of that message. A label for the campaign page; the ad itself does not change.'}, 'headline': {'type': 'string', 'description': 'New headline. Google search ads fit 30 characters. On Meta this is the line under the picture, not the words in it.'}, 'creativeId': {'type': 'string', 'description': 'The ad (creative) to edit.'}, 'pictureLine': {'type': 'string', 'maxLength': 40, 'description': 'Meta: new words for the picture (the hook, 3 to 7 words), different from the headline. The picture is re-rendered.'}, 'destinationUrl': {'type': 'string', 'description': 'New landing page link, starting with https://'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'campaignId': {'type': 'string', 'description': 'Limit to one campaign. Omit to check every live campaign.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'campaignId': {'type': 'string', 'description': 'The draft in question, so a Facebook draft also offers the instant form and the answer can be checked against its ads.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['choice'], 'properties': {'url': {'type': 'string', 'maxLength': 500, 'description': "For site and link: the address the owner gave, as they gave it. For page with pageAction link: the link the page's button opens."}, 'choice': {'enum': ['page', 'site', 'link', 'instant_form'], 'type': 'string', 'description': "page: Plyto builds and hosts a landing page per ad group (a lead form, or a button to url when pageAction is link). site: a page on the owner's own website; pass url exactly as they gave it. link: their booking, checkout or signup link; pass url. Known form and booking tools get framed on a page we build, anything else gets the click directly. instant_form: no page, a Facebook instant form; Facebook drafts only."}, 'domain': {'type': 'string', 'maxLength': 200, 'description': 'For page, only when the owner asked to host it on their own domain: a subdomain of theirs (go.theirsite.com). DNS comes after and never blocks the launch.'}, 'decidedBy': {'enum': ['owner', 'agent'], 'type': 'string', 'description': "owner (default) when they answered. agent when they said 'you pick' and you took the recommendation; say which you chose."}, 'campaignId': {'type': 'string', 'description': 'The draft this decides for: pages are built for it and its draft ads are pointed. Omit to record the choice for future drafts only.'}, 'pageAction': {'enum': ['form', 'link'], 'type': 'string', 'description': 'For page: what the page ends in. form (default): a short lead form we host, leads land in the CRM. link: a button to url.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'description': 'The live Google campaign to sync.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'days': {'type': 'integer', 'default': 30, 'maximum': 90, 'minimum': 7, 'description': 'Window in days, default 30.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'description': 'The live campaign whose funnel to test.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'name', 'keywords', 'headlines', 'descriptions'], 'properties': {'name': {'type': 'string', 'maxLength': 60, 'minLength': 2, 'description': "Short intent-family name, e.g. 'Agencies'. The campaign name is prefixed automatically."}, 'keywords': {'type': 'array', 'items': {'type': 'string', 'maxLength': 80, 'minLength': 2}, 'maxItems': 20, 'minItems': 2, 'description': 'Search keywords for this intent. Bare strings become phrase match; [brackets] force exact.'}, 'headlines': {'type': 'array', 'items': {'type': 'string', 'maxLength': 30, 'minLength': 3}, 'maxItems': 15, 'minItems': 3, 'description': 'RSA headlines, 30 characters max each. Aim for 10 or more so Ad strength starts healthy.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'REQUIRED: the exact campaign this group belongs to. A draft id adds a draft group (nothing touches Google until launch); a live id is refused unless confirmLiveEdit is set.'}, 'landingUrl': {'type': 'string', 'format': 'uri', 'description': 'Only when the owner named the link in this conversation (then also pass destinationSource "user") or the business has already decided where clicks go (business context: "Where ad clicks go"). Otherwise OMIT it: the group is created without a link, the result carries destinationAsk, and the owner decides. Never a page you picked yourself.'}, 'descriptions': {'type': 'array', 'items': {'type': 'string', 'maxLength': 90, 'minLength': 10}, 'maxItems': 4, 'minItems': 2, 'description': 'RSA descriptions, 90 characters max each.'}, 'confirmLiveEdit': {'type': 'boolean', 'description': 'Set true ONLY when the user explicitly asked to edit this specific LIVE campaign. Never set it while building a new campaign.'}, 'destinationSource': {'enum': ['user'], 'type': 'string', 'description': 'Set to "user" ONLY when the owner typed this exact URL in this conversation. Otherwise omit: the link must be on the website on file or a Plyto-hosted page, and the tool refuses anything else.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'adSetId'], 'properties': {'adSetId': {'type': 'string', 'minLength': 1, 'description': "The ad group's id (from the campaign page or ads.campaign.list)."}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign the ad group belongs to.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['variantUrl'], 'properties': {'variantUrl': {'type': 'string', 'format': 'uri', 'description': 'Full landing page URL for the B side, e.g. https://plyto.ai/go/new-era'}, 'adGroupNameContains': {'type': 'string', 'maxLength': 80, 'description': 'Only add the variant ad to ad groups whose name contains this text (case-insensitive). Omit to cover every enabled ad group.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'description': 'The live Google campaign whose ads to strengthen.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['userAskedToCreate', 'listId'], 'properties': {'name': {'type': 'string', 'maxLength': 80, 'description': 'Name for the audience in Google Ads.'}, 'listId': {'type': 'string', 'description': 'Plyto contact list to push to Google as an audience.'}, 'userAskedToCreate': {'type': 'boolean', 'description': 'True only if the user explicitly asked you to upload this list to Google as an audience. Discussing targeting, or listing existing audiences, is not asking you to upload anyone. If you are unsure, it is false: ask them first.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'mode'], 'properties': {'mode': {'enum': ['maximize_clicks', 'maximize_conversions'], 'type': 'string', 'description': "maximize_clicks buys as many clicks as the budget allows, capped per click; the right mode while conversion tracking has no data. maximize_conversions hands bidding to Google's conversion signal; only sensible once conversions are actually being recorded."}, 'campaignId': {'type': 'string', 'description': 'The live Google campaign to change.'}, 'maxCpcDollars': {'type': 'number', 'maximum': 50, 'minimum': 0.5, 'description': 'Ceiling per click in dollars for maximize_clicks, defaulting to 4. Ignored for maximize_conversions.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'campaignId': {'type': 'string', 'description': 'Limit the repair to one campaign. Omit to fix every live Google campaign on this business.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'callouts': {'type': 'array', 'items': {'type': 'string', 'maxLength': 25, 'minLength': 1}, 'maxItems': 10, 'minItems': 2, 'description': 'EXPLICIT callouts (max 25 chars each) that override generation, saved verbatim. Pass these to change callouts, or to pin the current ones unchanged during a sitelink edit. Omit to leave existing callouts untouched (sitelink-only write) or let Plyto draft them when none exist.'}, 'sitelinks': {'type': 'array', 'items': {'type': 'object', 'required': ['text', 'url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': "Full URL on the business's site."}, 'text': {'type': 'string', 'maxLength': 25, 'minLength': 1, 'description': 'Link text, max 25 chars.'}}}, 'maxItems': 8, 'minItems': 2, 'description': "EXPLICIT sitelinks that override generation. Pass these whenever the user names specific pages: each URL is still live-verified, and dead ones are dropped with a note. Omit to let Plyto choose from the site's sitemap."}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The DRAFT Google campaign to draft extensions for.'}, 'landingUrl': {'type': 'string', 'format': 'uri', 'description': "Base URL for sitelinks: the website on file or a Plyto-hosted page. Defaults to the campaign's ad destination. Never a guessed domain."}, 'destinationSource': {'enum': ['user'], 'type': 'string', 'description': 'Set to "user" ONLY when the owner typed this exact URL in this conversation. Otherwise omit: the link must be on the website on file or a Plyto-hosted page, and the tool refuses anything else.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'adGroupName', 'keywords'], 'properties': {'keywords': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 30, 'minItems': 1, 'description': 'Keywords to add. Plain text becomes phrase match.'}, 'campaignId': {'type': 'string', 'description': 'The live Google campaign.'}, 'adGroupName': {'type': 'string', 'description': 'Which ad group to add to, matched by name fragment.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'enabled'], 'properties': {'enabled': {'type': 'boolean', 'description': "false turns Google's partner sites off, which is the usual fix for cheap clicks that never convert. true opts back in."}, 'campaignId': {'type': 'string', 'description': 'The live Google campaign to change.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'adSetId': {'type': 'string', 'description': 'One ad group only. Omit for every ad group in the campaign.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The campaign whose ad groups get pages.'}, 'repointLiveAds': {'type': 'boolean', 'description': 'Move the SERVING ads of a live Google campaign onto the new pages. Leave this out unless the user has read the pages and said in this conversation to send their live traffic there. Building pages is free of consequence; this spends their real ad budget on a page they have not seen.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['adSetId', 'angle'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string', 'maxLength': 24, 'minLength': 1}, 'maxItems': 8}, 'angle': {'type': 'string', 'maxLength': 300, 'minLength': 8, 'description': "The pitch this page leads with, different from the ad group's existing page: 'lead with the insurance claim', 'proof first', 'the owner's own voice', 'the spring offer'. Plyto's copywriter writes the page from the ad, the brand profile, the claims on file and this angle; you do not write the lines."}, 'embed': {'type': 'string', 'maxLength': 4000}, 'accent': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'ctaUrl': {'type': 'string', 'maxLength': 500}, 'adSetId': {'type': 'string', 'minLength': 1, 'description': 'The ad group this page answers (ads.campaign.get lists ad groups with ids).'}, 'ctaLabel': {'type': 'string', 'maxLength': 28, 'minLength': 1, 'description': 'Only when the owner named the button.'}, 'headline': {'type': 'string', 'maxLength': 90, 'minLength': 1, 'description': 'ONLY when the owner dictated the exact headline. Otherwise leave it to the copywriter.'}, 'creativeId': {'type': 'string', 'minLength': 1, 'description': "The one ad this page answers, when the ad group carries more than one message (a CRM ad and an ads-management ad in one audience). The headline answers THAT ad's headline. Omitted: the page answers the ad group's ads together."}, 'ownerNotes': {'type': 'string', 'maxLength': 1200, 'description': 'Facts the owner stated in this conversation that the page may use, in their words (an offer, a price, a timeframe, a credential). Never anything they did not say.'}, 'destination': {'enum': ['form', 'link', 'embed'], 'type': 'string', 'description': 'form (default for a business that calls people back), link to ctaUrl (the signup or checkout page for self-serve software), or embed their own form or calendar.'}, 'heroImageUrl': {'type': 'string', 'format': 'uri', 'description': "A url from ads.assets.list. Omit and the ad's own picture, or the newest real photo of the business, is used."}, 'pointDraftAds': {'type': 'boolean', 'description': "On a DRAFT campaign only: make this the page the ad group's ads link to. Live ads never move here; the owner does that from the page's screen."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pageId'], 'properties': {'pageId': {'type': 'string', 'minLength': 1, 'description': "The page's id or slug, from ads.landing_pages.list or the address the owner pasted."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'campaignId': {'type': 'string', 'description': 'Limit to one campaign. Omit for every page in the business.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pageId'], 'properties': {'faq': {'type': 'array', 'items': {'type': 'object', 'required': ['q', 'a'], 'properties': {'a': {'type': 'string', 'maxLength': 220, 'minLength': 1}, 'q': {'type': 'string', 'maxLength': 90, 'minLength': 1}}}, 'maxItems': 6, 'description': 'The questions a visitor asks before calling, answered only from facts on file. Replaces the whole list when passed.'}, 'tags': {'type': 'array', 'items': {'type': 'string', 'maxLength': 24, 'minLength': 1}, 'maxItems': 8, 'description': "The owner's own labels. Replaces the list."}, 'embed': {'type': 'string', 'maxLength': 4000, 'description': 'The share link or the embed code of their form or calendar, as the owner pasted it, when destination is embed.'}, 'proof': {'type': 'array', 'items': {'type': 'string', 'maxLength': 70, 'minLength': 1}, 'maxItems': 3, 'description': 'Trust lines under the form. Only claims on file.'}, 'steps': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'body'], 'properties': {'body': {'type': 'string', 'maxLength': 130, 'minLength': 1}, 'title': {'type': 'string', 'maxLength': 40, 'minLength': 1}}}, 'maxItems': 3, 'description': 'What happens after they get in touch, from their side. Replaces the whole list when passed.'}, 'unset': {'type': 'array', 'items': {'enum': ['subheadline', 'heroCaption', 'heroImageUrl', 'accent', 'bullets', 'steps', 'proof', 'tags', 'faq', 'ownerNote'], 'type': 'string'}, 'description': 'Fields to clear.'}, 'accent': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$', 'description': 'Hex like #1f5f3b. Buttons, the top bar, the step numbers. Omit to keep; unset to go back to the brand color.'}, 'ctaUrl': {'type': 'string', 'maxLength': 500, 'description': 'Where the button goes when destination is link.'}, 'pageId': {'type': 'string', 'minLength': 1, 'description': "The page's id or slug."}, 'bullets': {'type': 'array', 'items': {'type': 'string', 'maxLength': 96, 'minLength': 1}, 'maxItems': 4, 'description': 'Replaces the whole list when passed. Each is a bold lead sentence then one detail sentence.'}, 'ctaLabel': {'type': 'string', 'maxLength': 28, 'minLength': 1}, 'headline': {'type': 'string', 'maxLength': 90, 'minLength': 1}, 'ownerNote': {'type': 'string', 'maxLength': 340, 'description': "Two or three sentences in the owner's voice, only facts on file. Empty string takes it off."}, 'destination': {'enum': ['form', 'link', 'embed'], 'type': 'string', 'description': 'form: the page collects details with the Plyto lead form (leads become contacts tied to the ad). link: the button goes to ctaUrl (their booking page, shop, tel: or mailto:) and no form is shown. embed: THEIR OWN form or booking calendar framed on the page (Calendly, Cal.com, Typeform, HubSpot, JotForm, Google Forms, Jobber, Housecall Pro, Acuity, Square and most others), from embed; leads land in that tool, so the page counts visits, not leads.'}, 'heroCaption': {'type': 'string', 'maxLength': 110, 'description': 'One true line under the photo. Never a job, street or outcome that was not stated.'}, 'subheadline': {'type': 'string', 'maxLength': 180}, 'heroImageUrl': {'type': 'string', 'format': 'uri', 'description': 'A url from ads.assets.list. The library only; never an outside address.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['userAskedToCreate', 'name', 'headline', 'websiteUrl', 'privacyPolicyUrl'], 'properties': {'name': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Internal name for the form.'}, 'fields': {'type': 'array', 'items': {'enum': ['FULL_NAME', 'FIRST_NAME', 'LAST_NAME', 'PHONE', 'COMPANY_NAME', 'CITY', 'JOB_TITLE'], 'type': 'string'}, 'default': ['FULL_NAME', 'PHONE'], 'description': 'Fields to ask for beyond email, which is always included. Every extra field costs submissions.'}, 'quality': {'enum': ['HIGHER_VOLUME', 'HIGHER_INTENT'], 'type': 'string', 'default': 'HIGHER_VOLUME', 'description': 'HIGHER_INTENT adds a review step: fewer leads, better ones. Suggest it for high-ticket services.'}, 'headline': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': "Shown at the top of the form, e.g. 'Get a free roof estimate'."}, 'websiteUrl': {'type': 'string', 'format': 'uri', 'description': 'Where the thank-you screen sends people.'}, 'description': {'type': 'string', 'maxLength': 80, 'description': 'One short supporting line under the headline.'}, 'privacyPolicyUrl': {'type': 'string', 'format': 'uri', 'description': "Required by Meta. Use the business website if there's no policy page."}, 'userAskedToCreate': {'type': 'boolean', 'description': 'True only if the user explicitly asked you to create this lead form on their Facebook page. Discussing form fields, or drafting one, is not asking you to create it on the page. If you are unsure, it is false: ask them first.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'adSetIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 20, 'description': 'The ad sets to create on Meta. Omitted: every ad set in the campaign that is not on Meta yet.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The launched Meta campaign (live or paused) the new ad sets belong to.'}, 'confirmPublish': {'type': 'boolean', 'description': 'Set true only after the user said to put these ad sets on Meta. Without it the tool explains what would happen and creates nothing.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'creativeIds'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The launched Meta campaign (live or paused) the draft ads belong to.'}, 'creativeIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 10, 'minItems': 1, 'description': 'The draft ads to put on Meta. Each must already have an image or video attached.'}, 'confirmPublish': {'type': 'boolean', 'description': 'Set true only after the user said to add these ads to this campaign. Without it the tool explains what would happen and publishes nothing.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The launched Meta campaign the ads belong to.'}, 'everything': {'type': 'boolean', 'description': 'With creativeIds omitted: push every ad on Meta, changed or not. Default false.'}, 'creativeIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 100, 'description': 'The ads to push. Omitted: every ad of the campaign on Meta whose picture, copy or link changed since its last push.'}, 'confirmRefresh': {'type': 'boolean', 'description': 'Set true only after the user said to push the edits to Meta. Without it the tool says what would change and pushes nothing.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'goal'], 'properties': {'goal': {'enum': ['conversions', 'landing_page_views'], 'type': 'string', 'description': "landing_page_views: aim for people who reach the page (the start for an account with no conversions yet). conversions: aim for the objective's own event, a Lead on a leads campaign (once leads are coming in)."}, 'confirm': {'type': 'boolean', 'description': 'Set true only after the user said to switch. Without it the tool says what changes and changes nothing.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'The Meta campaign (ads.campaign.list gives ids).'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId', 'terms'], 'properties': {'terms': {'type': 'array', 'items': {'type': 'string', 'maxLength': 80, 'minLength': 2}, 'maxItems': 50, 'minItems': 1, 'description': 'Search terms to stop showing ads for.'}, 'matchType': {'enum': ['BROAD', 'PHRASE', 'EXACT'], 'type': 'string', 'default': 'BROAD', 'description': 'BROAD blocks the whole family of that phrasing (right for junk traffic); EXACT blocks only that precise spelling.'}, 'campaignId': {'type': 'string', 'description': 'The Plyto campaign to block them on.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'description': 'The Plyto campaign to read.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'dateRange': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'from': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}}, 'description': 'Inclusive date range in YYYY-MM-DD. Defaults to the last 14 days.'}, 'campaignId': {'type': 'string', 'description': 'Limit analysis to a single campaign. Omit to analyze the whole business.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'dateRange': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'from': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}}, 'description': 'Inclusive date range in YYYY-MM-DD. Defaults to the last 7 days.'}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'Plyto campaign id (returned from ads.campaign.list).'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'maxPages': {'type': 'integer', 'default': 3, 'maximum': 5, 'minimum': 1}, 'campaignId': {'type': 'string', 'minLength': 1, 'description': 'A LIVE Google campaign with recorded search terms.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'days': {'anyOf': [{'type': 'number', 'const': 7}, {'type': 'number', 'const': 14}, {'type': 'number', 'const': 30}], 'default': 30, 'description': 'Reporting window.'}, 'campaignId': {'type': 'string', 'description': 'Limit to one Plyto campaign. Omit for the whole account.'}, 'onlyWasteful': {'type': 'boolean', 'default': False, 'description': 'Return just the zero-conversion terms worth blocking, instead of everything.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'days': {'anyOf': [{'type': 'number', 'const': 7}, {'type': 'number', 'const': 30}], 'description': '7 (default) or 30'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['automationId', 'fromStepId', 'toStepId'], 'properties': {'slot': {'enum': ['next', 'branch_false'], 'type': 'string', 'default': 'next'}, 'toStepId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'fromStepId': {'type': 'string', 'minLength': 1}, 'automationId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'trigger', 'steps'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'steps': {'type': 'array', 'items': {'oneOf': [{'type': 'object', 'required': ['kind', 'toolName', 'arguments'], 'properties': {'kind': {'type': 'string', 'const': 'action'}, 'skipIf': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'type': 'string', 'minLength': 1}, 'field': {'type': 'string', 'minLength': 1}, 'value': {}}}}}}, 'minItems': 1}}, 'description': 'Run-time skip condition: contacts matching this filter skip the step and continue down the chain. Use it to make journeys respect what already happened, e.g. skip a "connect your ad account" email for {or:[{and:[{field:"tag:google-ads-connected",op:"exists"}]}]}.'}, 'toolName': {'type': 'string', 'minLength': 1, 'description': 'Any registered agent tool, e.g. email.send, crm.tasks.create, crm.tags.add_to_contact. In arguments, the string "{{contact.id}}" resolves to the enrolled contact\'s id at run time.'}, 'arguments': {'type': 'object', 'description': 'Arguments for the tool.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}}, {'type': 'object', 'required': ['kind', 'seconds'], 'properties': {'kind': {'type': 'string', 'const': 'delay'}, 'seconds': {'type': 'integer', 'maximum': 7776000, 'minimum': 60, 'description': 'Wait this long before the next step (60s minimum, 90 days max).'}}}, {'type': 'object', 'required': ['kind', 'filter'], 'properties': {'kind': {'type': 'string', 'const': 'branch'}, 'filter': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'type': 'string', 'minLength': 1}, 'field': {'type': 'string', 'minLength': 1}, 'value': {}}}}}}, 'minItems': 1}}, 'description': 'W3 filter DSL evaluated against the enrolled contact. Match → continue to the next step; no match → the false path (or exit if none).'}}}, {'type': 'object', 'required': ['kind', 'eventType', 'timeoutSeconds'], 'properties': {'kind': {'type': 'string', 'const': 'wait_for_event'}, 'eventType': {'enum': ['contact.created', 'contact.updated', 'tag.added_to_contact', 'deal.created', 'deal.stage_changed', 'deal.won', 'deal.lost', 'task.completed', 'form.submitted', 'list.joined', 'email.sent', 'email.opened', 'email.clicked', 'email.bounced', 'ad_conversion.created', 'booking.lapsed', 'property_value.set', 'stripe.customer_created', 'stripe.subscription_started', 'stripe.payment_failed', 'stripe.subscription_past_due', 'stripe.payment_recovered', 'stripe.subscription_canceled'], 'type': 'string', 'description': 'Bus event to wait for, matched by the enrolled contact (e.g. email.opened).'}, 'timeoutSeconds': {'type': 'integer', 'maximum': 7776000, 'minimum': 60, 'description': 'Give up waiting after this long. Event received → next step; timeout → the false path if wired via connect_steps (slot branch_false), otherwise also the next step.'}}}]}, 'maxItems': 20, 'minItems': 1, 'description': 'Linear chain, executed in order.'}, 'trigger': {'type': 'object', 'required': ['eventType'], 'properties': {'eventType': {'enum': ['contact.created', 'contact.updated', 'tag.added_to_contact', 'deal.created', 'deal.stage_changed', 'deal.won', 'deal.lost', 'task.completed', 'form.submitted', 'list.joined', 'email.sent', 'email.opened', 'email.clicked', 'email.bounced', 'ad_conversion.created', 'booking.lapsed', 'property_value.set', 'stripe.customer_created', 'stripe.subscription_started', 'stripe.payment_failed', 'stripe.subscription_past_due', 'stripe.payment_recovered', 'stripe.subscription_canceled'], 'type': 'string'}, 'filterCriteria': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'type': 'string', 'minLength': 1}, 'field': {'type': 'string', 'minLength': 1}, 'value': {}}}}}}, 'minItems': 1}}, 'description': 'Optional: only enroll contacts matching this filter at trigger time.'}, 'suppressionDays': {'type': 'integer', 'maximum': 365, 'minimum': 1, 'description': "With every_match: don't re-enroll the same contact within this many days of their last entry (guards against repeat-trigger storms)."}, 'reEnrollmentPolicy': {'enum': ['once', 'every_match'], 'type': 'string', 'default': 'once', 'description': 'once = a contact can only ever enter this automation one time.'}}}, 'description': {'type': 'string', 'maxLength': 500}, 'exitCriteria': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'type': 'string', 'minLength': 1}, 'field': {'type': 'string', 'minLength': 1}, 'value': {}}}}}}, 'minItems': 1}}, 'description': 'Journey-level early exit, checked before EVERY step: a contact who matches leaves the automation immediately. Use for goal completion: billing reminders should carry {or:[{and:[{field:"tag:card-on-file",op:"exists"}]}]} so paying stops the nagging mid-sequence.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['enrollmentId'], 'properties': {'enrollmentId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['automationId'], 'properties': {'automationId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['enrollmentId'], 'properties': {'enrollmentId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'state': {'enum': ['active', 'completed', 'exited', 'failed'], 'type': 'string'}, 'automationId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['automationId'], 'properties': {'automationId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['automationId'], 'properties': {'automationId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['automationId'], 'properties': {'automationId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'includePast': {'type': 'boolean', 'default': False}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'availability'], 'properties': {'name': {'type': 'string', 'maxLength': 80, 'minLength': 2, 'description': 'Shown to the booker, e.g. "Intro call"'}, 'timezone': {'type': 'string', 'maxLength': 64}, 'description': {'type': 'string', 'maxLength': 300}, 'availability': {'type': 'object', 'required': ['0', '1', '2', '3', '4', '5', '6'], 'description': 'Weekly windows; at least one weekday required.', 'propertyNames': {'enum': ['0', '1', '2', '3', '4', '5', '6'], 'type': 'string'}, 'additionalProperties': {'type': 'array', 'items': {'type': 'array', 'prefixItems': [{'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$'}, {'type': 'string', 'pattern': '^([01]\\d|2[0-3]):[0-5]\\d$'}]}, 'maxItems': 4}}, 'maxDaysAhead': {'type': 'integer', 'default': 21, 'maximum': 60, 'minimum': 1}, 'bufferMinutes': {'type': 'integer', 'default': 0, 'maximum': 120, 'minimum': 0}, 'minNoticeHours': {'type': 'integer', 'default': 12, 'maximum': 168, 'minimum': 0}, 'durationMinutes': {'type': 'integer', 'default': 30, 'maximum': 240, 'minimum': 10}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': "The business's real name, exactly as the owner gave it."}, 'audience': {'type': 'string', 'maxLength': 600, 'minLength': 3, 'description': "Who they sell to, as they described it: 'homeowners in Austin with dogs', 'B2B SaaS founders under 20 employees'."}, 'industry': {'type': 'string', 'maxLength': 80, 'minLength': 2, 'description': "What kind of business, in their words: 'mobile dog grooming', 'roofing contractor', 'boutique fitness studio'."}, 'addClaims': {'type': 'array', 'items': {'type': 'string', 'maxLength': 140, 'minLength': 3}, 'maxItems': 8, 'description': "Durable facts the owner just stated that copy may rely on, one per entry, in their words: an offer ('Free roof inspections'), a price ('Shingle repair from $350'), financing ('0% financing for 12 months'), a response time ('Same-day response for storm calls'), a credential ('Licensed and insured in Washington'), hours. Added to the approved claims; existing ones stay. Never put here what the owner did not say."}, 'valueProp': {'type': 'string', 'maxLength': 600, 'minLength': 3, 'description': "What sets them apart, in one or two sentences, from the owner's own words."}, 'websiteUrl': {'type': 'string', 'maxLength': 300, 'minLength': 3, 'description': 'Their website, with or without https://.'}, 'clickTarget': {'enum': ['page', 'url'], 'type': 'string', 'description': "Where an ad's click goes, only as the OWNER answered it (prefer ads.destination.set, which also builds the page or points the ads). page: Plyto builds a landing page per ad group (it collects leads with a form, or converts on conversionUrl when one is set). url: the ads send people straight to conversionUrl, no page is built. There is no default: unanswered stays unanswered."}, 'contactPhone': {'type': 'string', 'maxLength': 40, 'minLength': 7, 'description': 'The phone number pages and landing pages should show, as the owner gave it.'}, 'conversionUrl': {'type': 'string', 'maxLength': 500, 'description': 'Their own signup, booking, checkout or landing page link, as the owner gave it. Pass an empty string to clear it.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['activityId'], 'properties': {'activityId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'type': {'enum': ['call', 'email', 'meeting', 'sms', 'other'], 'type': 'string'}, 'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'dealId': {'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'ownerUserId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['type', 'title'], 'properties': {'body': {'type': 'string', 'maxLength': 5000}, 'type': {'enum': ['call', 'email', 'meeting', 'sms', 'other'], 'type': 'string'}, 'title': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'dealId': {'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'happenedAt': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$', 'description': 'ISO 8601. Default: now.'}, 'ownerUserId': {'type': 'string'}, 'durationMinutes': {'type': 'integer', 'maximum': 1440, 'exclusiveMinimum': 0}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'size': {'enum': ['1-10', '11-50', '51-200', '201-1000', '1001-5000', '5001+'], 'type': 'string'}, 'domain': {'type': 'string', 'maxLength': 255}, 'industry': {'type': 'string', 'maxLength': 120}, 'description': {'type': 'string', 'maxLength': 2000}, 'annualRevenueCents': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId'], 'properties': {'companyId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId'], 'properties': {'companyId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'ownerUserId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'size': {'anyOf': [{'enum': ['1-10', '11-50', '51-200', '201-1000', '1001-5000', '5001+'], 'type': 'string'}, {'type': 'null'}]}, 'domain': {'anyOf': [{'type': 'string', 'maxLength': 255}, {'type': 'null'}]}, 'industry': {'anyOf': [{'type': 'string', 'maxLength': 120}, {'type': 'null'}]}, 'companyId': {'type': 'string', 'minLength': 1}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 2000}, {'type': 'null'}]}, 'ownerUserId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'annualRevenueCents': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", 'description': 'Primary email, used as dedup key.'}, 'phone': {'type': 'string', 'maxLength': 40}, 'title': {'type': 'string', 'maxLength': 120}, 'source': {'type': 'string', 'maxLength': 60, 'description': "Where this contact came from: 'manual', 'import', 'form', 'ad', etc."}, 'lastName': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'companyId': {'type': 'string', 'description': 'Existing company id to link this contact to.'}, 'firstName': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'leadStatus': {'enum': ['new', 'open', 'in_progress', 'open_deal', 'unqualified', 'attempted', 'connected', 'bad_timing'], 'type': 'string'}, 'sourceDetail': {'type': 'string', 'maxLength': 200}, 'lifecycleStage': {'enum': ['subscriber', 'lead', 'marketing_qualified', 'sales_qualified', 'opportunity', 'customer', 'evangelist', 'other'], 'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId'], 'properties': {'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId'], 'properties': {'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'hasEmail': {'type': 'boolean'}, 'ownerUserId': {'type': 'string'}, 'lifecycleStage': {'enum': ['subscriber', 'lead', 'marketing_qualified', 'sales_qualified', 'opportunity', 'customer', 'evangelist', 'other'], 'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['filter'], 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1}, 'filter': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'enum': ['equals', 'not_equals', 'contains', 'not_contains', 'starts_with', 'ends_with', 'in', 'not_in', 'has_any_of', 'has_all_of', 'gt', 'lt', 'gte', 'lte', 'between', 'before', 'after', 'in_last_days', 'is_empty', 'is_not_empty', 'exists', 'not_exists'], 'type': 'string', 'description': 'See crm.contacts.query description for op-vs-kind compatibility.'}, 'field': {'type': 'string', 'minLength': 1, 'description': 'Stock field (email, firstName, lifecycleStage, ...), custom:<key>, tag:<name>, or has:<predicate> (open_deal/won_deal/task_open/company)'}, 'value': {}}}, 'minItems': 1}}}, 'minItems': 1, 'description': 'DNF: outer OR of AND groups. Two-level nesting max.'}}}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId'], 'properties': {'email': {'anyOf': [{'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}, {'type': 'null'}]}, 'phone': {'anyOf': [{'type': 'string', 'maxLength': 40}, {'type': 'null'}]}, 'title': {'anyOf': [{'type': 'string', 'maxLength': 120}, {'type': 'null'}]}, 'lastName': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'companyId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'contactId': {'type': 'string', 'minLength': 1}, 'firstName': {'anyOf': [{'type': 'string', 'maxLength': 120, 'minLength': 1}, {'type': 'null'}]}, 'leadStatus': {'anyOf': [{'enum': ['new', 'open', 'in_progress', 'open_deal', 'unqualified', 'attempted', 'connected', 'bad_timing'], 'type': 'string'}, {'type': 'null'}]}, 'ownerUserId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'lifecycleStage': {'enum': ['subscriber', 'lead', 'marketing_qualified', 'sales_qualified', 'opportunity', 'customer', 'evangelist', 'other'], 'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}, 'reason': {'type': 'string', 'maxLength': 500}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'source': {'type': 'string', 'maxLength': 60}, 'stageId': {'type': 'string'}, 'currency': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': 'ISO 4217 code, default USD.'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'pipelineId': {'type': 'string'}, 'valueCents': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'ownerUserId': {'type': 'string'}, 'expectedCloseAt': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$', 'description': 'ISO 8601 timestamp.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'open': {'type': 'boolean'}, 'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'stageId': {'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'pipelineId': {'type': 'string'}, 'ownerUserId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId', 'targetStageId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}, 'targetStageId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'dealId': {'type': 'string', 'minLength': 1}, 'source': {'anyOf': [{'type': 'string', 'maxLength': 60}, {'type': 'null'}]}, 'currency': {'type': 'string', 'maxLength': 3, 'minLength': 3}, 'companyId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'contactId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'valueCents': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'ownerUserId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'expectedCloseAt': {'anyOf': [{'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$'}, {'type': 'null'}]}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listId', 'contactId'], 'properties': {'listId': {'type': 'string', 'minLength': 1}, 'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listId'], 'properties': {'listId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'type'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'type': {'enum': ['manual', 'dynamic'], 'type': 'string'}, 'criteria': {'type': 'object', 'required': ['or'], 'properties': {'or': {'type': 'array', 'items': {'type': 'object', 'required': ['and'], 'properties': {'and': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'op'], 'properties': {'op': {'type': 'string', 'minLength': 1}, 'field': {'type': 'string', 'minLength': 1}, 'value': {}}}}}}}}}, 'description': {'type': 'string', 'maxLength': 500}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listId'], 'properties': {'listId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'includeArchived': {'type': 'boolean'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listId'], 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1}, 'listId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listId', 'contactId'], 'properties': {'listId': {'type': 'string', 'minLength': 1}, 'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['body'], 'properties': {'body': {'type': 'string', 'maxLength': 10000, 'minLength': 1}, 'dealId': {'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'dealId': {'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'includeArchived': {'type': 'boolean'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pipelineId'], 'properties': {'pipelineId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['propertyDefinitionId'], 'properties': {'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId', 'propertyDefinitionId'], 'properties': {'companyId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId', 'propertyDefinitionId'], 'properties': {'contactId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId', 'propertyDefinitionId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['entityType', 'key', 'label', 'propertyType'], 'properties': {'key': {'type': 'string', 'pattern': '^[a-z][a-z0-9_]*$', 'maxLength': 60, 'minLength': 1}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'label'], 'properties': {'color': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'value': {'type': 'string', 'maxLength': 120, 'minLength': 1}}}, 'maxItems': 50, 'minItems': 1}, 'entityType': {'enum': ['contact', 'company', 'deal'], 'type': 'string'}, 'isRequired': {'type': 'boolean'}, 'description': {'type': 'string', 'maxLength': 500}, 'displayOrder': {'type': 'integer', 'maximum': 10000, 'minimum': 0}, 'propertyType': {'enum': ['text', 'number', 'date', 'single_select', 'multi_select', 'checkbox', 'url', 'email'], 'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId'], 'properties': {'dealId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['entityType'], 'properties': {'entityType': {'enum': ['contact', 'company', 'deal'], 'type': 'string'}, 'includeArchived': {'type': 'boolean'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId', 'propertyDefinitionId', 'value'], 'properties': {'value': {'anyOf': [{'type': 'string'}, {'type': 'number'}, {'type': 'boolean'}, {'type': 'array', 'items': {'type': 'string'}}]}, 'companyId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId', 'propertyDefinitionId', 'value'], 'properties': {'value': {'anyOf': [{'type': 'string'}, {'type': 'number'}, {'type': 'boolean'}, {'type': 'array', 'items': {'type': 'string'}}]}, 'contactId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['dealId', 'propertyDefinitionId', 'value'], 'properties': {'value': {'anyOf': [{'type': 'string'}, {'type': 'number'}, {'type': 'boolean'}, {'type': 'array', 'items': {'type': 'string'}}]}, 'dealId': {'type': 'string', 'minLength': 1}, 'propertyDefinitionId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'windowDays': {'type': 'integer', 'maximum': 730, 'minimum': 1, 'description': 'Look-back window in days; each funnel stage is windowed independently (leads created / deals opened / deals won inside it). Default 90.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId', 'tagId'], 'properties': {'tagId': {'type': 'string', 'minLength': 1}, 'companyId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId', 'tagId'], 'properties': {'tagId': {'type': 'string', 'minLength': 1}, 'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'color': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId'], 'properties': {'companyId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId'], 'properties': {'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['companyId', 'tagId'], 'properties': {'tagId': {'type': 'string', 'minLength': 1}, 'companyId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['contactId', 'tagId'], 'properties': {'tagId': {'type': 'string', 'minLength': 1}, 'contactId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['taskId'], 'properties': {'taskId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['taskId'], 'properties': {'taskId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title'], 'properties': {'dueAt': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$', 'description': 'ISO 8601 timestamp.'}, 'title': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'dealId': {'type': 'string'}, 'priority': {'enum': ['low', 'medium', 'high', 'urgent'], 'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'description': {'type': 'string', 'maxLength': 5000}, 'assignedToUserId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['taskId'], 'properties': {'taskId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'dealId': {'type': 'string'}, 'status': {'enum': ['open', 'completed', 'cancelled'], 'type': 'string'}, 'companyId': {'type': 'string'}, 'contactId': {'type': 'string'}, 'assignedToUserId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'How many, newest first (default 20).'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['documentId'], 'properties': {'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': "Character to start from, to read a long document in parts (the previous result's `to`)."}, 'documentId': {'type': 'string', 'minLength': 1, 'description': 'The id from documents.list or from "(document <id>)" in a message.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'bodyMd': {'type': 'string', 'maxLength': 20000, 'description': 'Markdown body. Merge tags: {{contact.firstName|there}}, {{business.name}}. The unsubscribe footer is added automatically at send.'}, 'subject': {'type': 'string', 'maxLength': 160}, 'previewText': {'type': 'string', 'maxLength': 200}, 'campaignType': {'enum': ['one_time_broadcast', 'newsletter', 'promotion', 'announcement', 're_engagement', 'educational'], 'type': 'string', 'default': 'one_time_broadcast'}, 'contactListId': {'type': 'string', 'description': 'Omit to target all subscribed contacts.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'campaignId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'status': {'enum': ['draft', 'scheduled', 'sending', 'sent', 'needs_attention', 'cancelled', 'archived'], 'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['campaignId'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'bodyMd': {'type': 'string', 'maxLength': 20000}, 'bodyMdB': {'type': 'string', 'maxLength': 20000, 'description': 'The B-side body. Required when abVariable is body.'}, 'subject': {'type': 'string', 'maxLength': 160}, 'subjectB': {'type': 'string', 'maxLength': 160, 'description': 'The B-side subject line. Required when abVariable is subject.'}, 'abVariable': {'enum': ['subject', 'body', 'off'], 'type': 'string', 'description': 'Run an A/B test on one variable. "subject" tests subjectB against subject, "body" tests bodyMdB against bodyMd, "off" ends the test and sends the A side to everyone. One variable at a time: testing two at once tells you nothing about which one moved the number.'}, 'campaignId': {'type': 'string', 'minLength': 1}, 'previewText': {'type': 'string', 'maxLength': 200}, 'scheduledAt': {'type': 'string', 'description': 'ISO 8601; required when scheduleType is scheduled.'}, 'scheduleType': {'enum': ['send_now', 'scheduled'], 'type': 'string'}, 'contactListId': {'type': 'string', 'description': 'A list id, or "" to target all subscribed contacts.'}, 'abSplitPercent': {'type': 'integer', 'maximum': 50, 'minimum': 5, 'description': 'Percentage of the audience that receives the B side. Defaults to 50 for a straight split. Below 50 holds B back as the challenger.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'subject', 'body'], 'properties': {'body': {'type': 'string', 'maxLength': 20000, 'minLength': 1}, 'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'subject': {'type': 'string', 'maxLength': 200, 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'sinceDays': {'type': 'integer', 'maximum': 365, 'minimum': 1}, 'templateId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1}, 'contactId': {'type': 'string'}, 'templateId': {'type': 'string'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'includeArchived': {'type': 'boolean'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['signature'], 'properties': {'signature': {'type': 'string', 'maxLength': 2000, 'description': "The full signature block, e.g. 'Best,\\nRoss Gray\\nPlyto'. Empty string clears it."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'slug', 'fields'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]*$', 'maxLength': 60, 'minLength': 1}, 'theme': {'type': 'object', 'properties': {'imageUrl': {'type': 'string', 'description': 'Banner image URL shown at the top of the hosted form'}, 'accentColor': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'description': {'type': 'string', 'maxLength': 500, 'description': 'Intro paragraph under the form title'}}, 'description': 'Per-form appearance; omitted values inherit the business brand'}, 'fields': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label', 'type'], 'properties': {'key': {'type': 'string', 'pattern': '^[a-z][a-z0-9_]*$', 'maxLength': 60, 'minLength': 1}, 'type': {'enum': ['text', 'email', 'url', 'number', 'date', 'checkbox', 'select', 'multi_select', 'textarea', 'phone'], 'type': 'string'}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'value': {'type': 'string', 'maxLength': 120, 'minLength': 1}}}, 'maxItems': 50, 'minItems': 1}, 'required': {'type': 'boolean'}, 'placeholder': {'type': 'string', 'maxLength': 200}, 'mapsToContactPropertyKey': {'type': 'string', 'maxLength': 60}}}, 'maxItems': 50, 'minItems': 1}, 'captureToListId': {'type': 'string'}, 'thankYouMessage': {'type': 'string', 'maxLength': 500}, 'submitButtonText': {'type': 'string', 'maxLength': 60}, 'thankYouRedirectUrl': {'type': 'string', 'format': 'uri'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['formId'], 'properties': {'formId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['formId'], 'properties': {'formId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'includeArchived': {'type': 'boolean'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['formId'], 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1}, 'formId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['formId'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'theme': {'anyOf': [{'type': 'object', 'properties': {'title': {'type': 'string', 'maxLength': 120, 'description': 'Public heading; the internal name stays for lists'}, 'imageUrl': {'type': 'string'}, 'accentColor': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'description': {'type': 'string', 'maxLength': 500}}}, {'type': 'null'}], 'description': 'Replaces the whole theme; null clears it back to brand defaults'}, 'fields': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label', 'type'], 'properties': {'key': {'type': 'string', 'pattern': '^[a-z][a-z0-9_]*$', 'maxLength': 60, 'minLength': 1}, 'type': {'enum': ['text', 'email', 'url', 'number', 'date', 'checkbox', 'select', 'multi_select', 'textarea', 'phone'], 'type': 'string'}, 'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'value': {'type': 'string', 'maxLength': 120, 'minLength': 1}}}, 'maxItems': 50, 'minItems': 1}, 'required': {'type': 'boolean'}, 'placeholder': {'type': 'string', 'maxLength': 200}, 'mapsToContactPropertyKey': {'type': 'string', 'maxLength': 60}}}, 'maxItems': 50, 'minItems': 1}, 'formId': {'type': 'string', 'minLength': 1}, 'captureToListId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'thankYouMessage': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}]}, 'submitButtonText': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'thankYouRedirectUrl': {'anyOf': [{'type': 'string', 'format': 'uri'}, {'type': 'null'}]}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['memoryId'], 'properties': {'memoryId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['content', 'kind'], 'properties': {'kind': {'enum': ['preference', 'fact', 'playbook', 'correction'], 'type': 'string', 'description': 'preference = how they like things done; fact = stable business fact; playbook = how to run a recurring task; correction = a fix after you got something wrong.'}, 'scope': {'enum': ['business', 'personal'], 'type': 'string', 'description': "business (default) = applies to everyone; personal = only the current user's own preference (e.g. how THEY want summaries)."}, 'source': {'enum': ['user_told', 'learned'], 'type': 'string', 'description': 'user_told (default) = the user explicitly said it; learned = you inferred it from a correction or repeated behavior.'}, 'content': {'type': 'string', 'maxLength': 500, 'minLength': 1, 'description': 'The rule itself, self-contained and imperative.'}, 'memoryId': {'type': 'string', 'description': 'Update this existing memory instead of creating a new one.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['brief'], 'properties': {'brief': {'type': 'string', 'maxLength': 2000, 'minLength': 10, 'description': "What the pitch should accomplish and for whom, in plain language: the offer, the angle, anything the user said about the audience or meeting. The deck grounds itself in the brand kit and approved claims automatically; when a dealId/companyId/contactId is given it also grounds in that CRM record. Never invent facts the brief and CRM don't contain."}, 'title': {'type': 'string', 'maxLength': 160, 'description': 'Deck title. Defaults to the deal/company pairing.'}, 'dealId': {'type': 'string', 'description': 'Ground the pitch in this deal (pulls its company, contact, and value).'}, 'companyId': {'type': 'string', 'description': 'Ground the pitch in this CRM company.'}, 'contactId': {'type': 'string', 'description': 'Ground the pitch in this contact.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['deckId'], 'properties': {'deckId': {'type': 'string', 'minLength': 1, 'description': 'The pitch deck to delete permanently.'}, 'confirm': {'type': 'boolean', 'description': "Must be true to actually delete. Call WITHOUT it first: the tool returns the deck's title so you can confirm with the user. Set true only after the user approved deleting THIS deck by name in this conversation."}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['deckId', 'slideNumber', 'instruction'], 'properties': {'deckId': {'type': 'string', 'minLength': 1, 'description': 'The pitch deck to edit.'}, 'instruction': {'type': 'string', 'maxLength': 1500, 'minLength': 5, 'description': "What to change on that slide, in plain language (rewrite the headline, soften the pricing framing, swap the layout emphasis). One slide per call. Never instruct it to add statistics or testimonials that aren't in the CRM or approved claims."}, 'slideNumber': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Which slide to change, 1-based. Get the order from pitches.list or the deck itself.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'config'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': "Card title, e.g. 'Deals won by month'"}, 'config': {'type': 'object', 'required': ['entity', 'metric', 'viz'], 'properties': {'viz': {'enum': ['number', 'bar', 'table'], 'type': 'string', 'description': 'number = one big stat (no groupBy); bar/table need groupBy'}, 'entity': {'enum': ['contacts', 'deals', 'tasks', 'emails', 'stage_transitions', 'ad_metrics', 'sources'], 'type': 'string', 'description': "stage_transitions = deal stage-change events (one row per stage a deal entered), for 'stage moves per month' or 'deals entering each stage'. ad_metrics = daily ad performance snapshots (spend/conversions/clicks/impressions). sources = deals grouped by the linked contact's marketing source, for 'revenue won by source' (metric=sum_value, filter stageType=won) or 'deals by source'; use entity=contacts groupBy=source for lead counts instead."}, 'metric': {'enum': ['count', 'sum_value', 'avg_value', 'sum_spend', 'sum_conversions', 'sum_clicks', 'sum_impressions'], 'type': 'string', 'description': 'sum_value/avg_value = deal value, only valid for entity=deals or sources. sum_spend/sum_conversions/sum_clicks/sum_impressions = daily ad performance, only valid for entity=ad_metrics (which requires one of them).'}, 'filters': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'value'], 'properties': {'field': {'type': 'string', 'maxLength': 40}, 'value': {'type': 'string', 'maxLength': 60}}}, 'maxItems': 4, 'description': 'Equality filters. contacts: lifecycleStage(lead|marketing_qualified|sales_qualified|customer), source. deals: stageType(open|won|lost). tasks: status(open|completed|cancelled), priority(low|medium|high|urgent). emails: status(queued|sent|delivered|opened|clicked|bounced|failed). stage_transitions: toStageType(open|won|lost). ad_metrics: campaignId(an ad campaign id). sources: stageType(open|won|lost), source(a contact source value like form|webhook|manual|import|ad).'}, 'groupBy': {'type': 'string', 'maxLength': 40, 'description': 'Bar/table grouping. contacts: lifecycleStage|source|month. deals: stage|stageType|month. tasks: status|priority|month. emails: status|month. stage_transitions: stage|month (stage = the stage entered). ad_metrics: campaign|month. sources: source|month. Omit for a single number.'}, 'windowDays': {'type': 'integer', 'maximum': 730, 'minimum': 1, 'description': 'Only rows from the last N days (created date; closed date for won/lost deals)'}}}, 'description': {'type': 'string', 'maxLength': 300}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['config'], 'properties': {'config': {'type': 'object', 'required': ['entity', 'metric', 'viz'], 'properties': {'viz': {'enum': ['number', 'bar', 'table'], 'type': 'string', 'description': 'number = one big stat (no groupBy); bar/table need groupBy'}, 'entity': {'enum': ['contacts', 'deals', 'tasks', 'emails', 'stage_transitions', 'ad_metrics', 'sources'], 'type': 'string', 'description': "stage_transitions = deal stage-change events (one row per stage a deal entered), for 'stage moves per month' or 'deals entering each stage'. ad_metrics = daily ad performance snapshots (spend/conversions/clicks/impressions). sources = deals grouped by the linked contact's marketing source, for 'revenue won by source' (metric=sum_value, filter stageType=won) or 'deals by source'; use entity=contacts groupBy=source for lead counts instead."}, 'metric': {'enum': ['count', 'sum_value', 'avg_value', 'sum_spend', 'sum_conversions', 'sum_clicks', 'sum_impressions'], 'type': 'string', 'description': 'sum_value/avg_value = deal value, only valid for entity=deals or sources. sum_spend/sum_conversions/sum_clicks/sum_impressions = daily ad performance, only valid for entity=ad_metrics (which requires one of them).'}, 'filters': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'value'], 'properties': {'field': {'type': 'string', 'maxLength': 40}, 'value': {'type': 'string', 'maxLength': 60}}}, 'maxItems': 4, 'description': 'Equality filters. contacts: lifecycleStage(lead|marketing_qualified|sales_qualified|customer), source. deals: stageType(open|won|lost). tasks: status(open|completed|cancelled), priority(low|medium|high|urgent). emails: status(queued|sent|delivered|opened|clicked|bounced|failed). stage_transitions: toStageType(open|won|lost). ad_metrics: campaignId(an ad campaign id). sources: stageType(open|won|lost), source(a contact source value like form|webhook|manual|import|ad).'}, 'groupBy': {'type': 'string', 'maxLength': 40, 'description': 'Bar/table grouping. contacts: lifecycleStage|source|month. deals: stage|stageType|month. tasks: status|priority|month. emails: status|month. stage_transitions: stage|month (stage = the stage entered). ad_metrics: campaign|month. sources: source|month. Omit for a single number.'}, 'windowDays': {'type': 'integer', 'maximum': 730, 'minimum': 1, 'description': 'Only rows from the last N days (created date; closed date for won/lost deals)'}}}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['title', 'contentMd'], 'properties': {'title': {'type': 'string', 'maxLength': 200, 'minLength': 5}, 'excerpt': {'type': 'string', 'maxLength': 300}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10}, 'contentMd': {'type': 'string', 'maxLength': 50000, 'minLength': 200}, 'seoDescription': {'type': 'string', 'maxLength': 200}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['postsPerWeek'], 'properties': {'topics': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 3}, 'maxItems': 20}, 'autopublish': {'type': 'boolean'}, 'postsPerWeek': {'type': 'integer', 'maximum': 3, 'minimum': 0, 'description': '0 to 3 only. 0 pauses. Requests above 3 must be clamped to 3 with an explanation, never passed through.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 20, 'minimum': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'url': {'type': 'string', 'minLength': 4, 'description': 'Defaults to the business website.'}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['siteId', 'block'], 'properties': {'block': {'type': 'object', 'required': ['kind', 'content'], 'properties': {'kind': {'enum': ['hero', 'services', 'about', 'gallery', 'process', 'testimonials', 'team', 'pricing', 'areas', 'stats', 'cta', 'contact', 'faq', 'logos', 'before_after', 'hours', 'video', 'custom'], 'type': 'string'}, 'content': {'type': 'object', 'description': 'Shape by kind. Photos are {url, alt, caption} and the url MUST come from websites.photos (never invented). variant picks the layout where a kind has more than one.\nhero:{variant:split|photo|centered, eyebrow, headline, subheadline, ctaLabel, ctaHref, secondaryLabel, secondaryHref, image}\nservices:{variant:cards|list|photo-cards, heading, intro, items:[{title, body, image?, href?}]}\nabout:{variant:split|story, heading, body (paragraphs separated by blank lines), image, byline}\ngallery:{heading, intro, images:[image]}\nprocess:{heading, steps:[{title, body}]}\ntestimonials:{variant:cards|spotlight, heading, items:[{quote, author, detail?, image?}]}\nteam:{heading, intro, people:[{name, role?, bio?, image?}]}\npricing:{variant:cards|table, heading, intro, note, items:[{name, price, unit?, detail?, featured?}]}\nareas:{heading, intro, places:[string], mapEmbedUrl?}\nstats:{items:[{value, label}]}\ncta:{headline, body, ctaLabel, ctaHref}\ncontact:{variant:split|centered, heading, intro, phone?, email?, address?, hours:[{days, time}]} (formId is wired for you)\nfaq:{heading, items:[{q, a}]}\nlogos:{heading, logos:[image]}\nbefore_after:{heading, pairs:[{before:image, after:image, caption?}]}\nhours:{heading, hours:[{days, time}], address?, phone?, mapEmbedUrl?}\nvideo:{heading, url (YouTube or Vimeo), caption}\ncustom:{heading, body}', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}}, 'siteId': {'type': 'string', 'minLength': 1}, 'position': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['url'], 'properties': {'url': {'type': 'string', 'minLength': 4}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['siteId'], 'properties': {'siteId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'subdomain', 'blocks'], 'properties': {'dark': {'type': 'boolean', 'description': 'Dark background. Rare: only when the brand is dark or the owner asks.'}, 'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'blocks': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'content'], 'properties': {'kind': {'enum': ['hero', 'services', 'about', 'gallery', 'process', 'testimonials', 'team', 'pricing', 'areas', 'stats', 'cta', 'contact', 'faq', 'logos', 'before_after', 'hours', 'video', 'custom'], 'type': 'string'}, 'content': {'type': 'object', 'description': 'Shape by kind. Photos are {url, alt, caption} and the url MUST come from websites.photos (never invented). variant picks the layout where a kind has more than one.\nhero:{variant:split|photo|centered, eyebrow, headline, subheadline, ctaLabel, ctaHref, secondaryLabel, secondaryHref, image}\nservices:{variant:cards|list|photo-cards, heading, intro, items:[{title, body, image?, href?}]}\nabout:{variant:split|story, heading, body (paragraphs separated by blank lines), image, byline}\ngallery:{heading, intro, images:[image]}\nprocess:{heading, steps:[{title, body}]}\ntestimonials:{variant:cards|spotlight, heading, items:[{quote, author, detail?, image?}]}\nteam:{heading, intro, people:[{name, role?, bio?, image?}]}\npricing:{variant:cards|table, heading, intro, note, items:[{name, price, unit?, detail?, featured?}]}\nareas:{heading, intro, places:[string], mapEmbedUrl?}\nstats:{items:[{value, label}]}\ncta:{headline, body, ctaLabel, ctaHref}\ncontact:{variant:split|centered, heading, intro, phone?, email?, address?, hours:[{days, time}]} (formId is wired for you)\nfaq:{heading, items:[{q, a}]}\nlogos:{heading, logos:[image]}\nbefore_after:{heading, pairs:[{before:image, after:image, caption?}]}\nhours:{heading, hours:[{days, time}], address?, phone?, mapEmbedUrl?}\nvideo:{heading, url (YouTube or Vimeo), caption}\ncustom:{heading, body}', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}}, 'maxItems': 14, 'minItems': 1}, 'radius': {'enum': ['sharp', 'soft', 'round'], 'type': 'string', 'description': 'How rounded buttons and cards are. sharp for trades and professional services, soft is the default, round for hospitality and consumer.'}, 'scenes': {'type': 'boolean'}, 'pairing': {'enum': ['workshop', 'editorial', 'modern', 'warm'], 'type': 'string', 'description': 'Font pairing, chosen for the trade. workshop: Barlow Condensed + Inter, sturdy, direct, for trades, contractors, auto, landscaping, anything with a truck. editorial: Fraunces + Source Sans 3, calm, trustworthy, for dental, medical, legal, accounting, bookkeeping, finance, coaching, wellness. modern: Plus Jakarta Sans + Inter, clean, current, for software, agencies, consultants, anything sold on a screen. warm: DM Serif Display + DM Sans, inviting, personal, for restaurants, bakeries, salons, boutiques, weddings, anything you taste or touch'}, 'seoTitle': {'type': 'string', 'maxLength': 65}, 'subdomain': {'type': 'string', 'pattern': '^[a-z0-9-]+$', 'maxLength': 50, 'minLength': 3}, 'primaryColor': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$', 'description': 'Accent color. Defaults to the brand color on file.'}, 'seoDescription': {'type': 'string', 'maxLength': 160}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['siteId'], 'properties': {'siteId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['blockId'], 'properties': {'blockId': {'type': 'string', 'minLength': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['siteId', 'blockIds'], 'properties': {'siteId': {'type': 'string', 'minLength': 1}, 'blockIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 20, 'minItems': 1}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['blockId'], 'properties': {'unset': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 20, 'description': 'Top-level fields to remove.'}, 'blockId': {'type': 'string', 'minLength': 1}, 'content': {'type': 'object', 'description': 'Fields to set or replace.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}}
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['siteId'], 'properties': {'dark': {'type': 'boolean', 'description': 'Dark background. Rare: only when the brand is dark or the owner asks.'}, 'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'radius': {'enum': ['sharp', 'soft', 'round'], 'type': 'string', 'description': 'How rounded buttons and cards are. sharp for trades and professional services, soft is the default, round for hospitality and consumer.'}, 'siteId': {'type': 'string', 'minLength': 1}, 'pairing': {'enum': ['workshop', 'editorial', 'modern', 'warm'], 'type': 'string', 'description': 'Font pairing, chosen for the trade. workshop: Barlow Condensed + Inter, sturdy, direct, for trades, contractors, auto, landscaping, anything with a truck. editorial: Fraunces + Source Sans 3, calm, trustworthy, for dental, medical, legal, accounting, bookkeeping, finance, coaching, wellness. modern: Plus Jakarta Sans + Inter, clean, current, for software, agencies, consultants, anything sold on a screen. warm: DM Serif Display + DM Sans, inviting, personal, for restaurants, bakeries, salons, boutiques, weddings, anything you taste or touch'}, 'seoTitle': {'anyOf': [{'type': 'string', 'maxLength': 65}, {'type': 'null'}]}, 'primaryColor': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$', 'description': 'Accent color. Defaults to the brand color on file.'}, 'seoDescription': {'anyOf': [{'type': 'string', 'maxLength': 160}, {'type': 'null'}]}}}
최근 도구 변경
유사한 MCP 서버
neuron
Operates AI chatbots and messaging workflows across WhatsApp and social channels, including contacts, campaigns, conversations, p…
freedom-mcp
Supports company operations through commitments, teams, agents, customer evidence, leads, content workflows, spreadsheets, commer…
Meta Council
Provides governed workflows for consulting, outreach, sales deals, invoices, marketing campaigns, content approvals, accounting a…
FavCRM
Provides CRM operations for customers, leads, deals, bookings, memberships, campaigns, WhatsApp and SMS messaging, invoices, loya…
GestãoClick
Connects to the GestãoClick ERP to manage customers, suppliers, products, sales, service orders, budgets, and financial records.
Odichat
Manages WhatsApp, Instagram, and Facebook inboxes with contacts, conversations, agents, automation rules, labels, canned response…
Rahul D Sarker: Marketing & RevOps Tools
Provides marketing, revenue operations, sales, advertising, SaaS, and conversion calculators, along with article search and consu…
YouSpot
Connects personal contacts, companies, notes, files, CRM records, email, Slack, LinkedIn, and calendars, with search, relationshi…