All integrations

Specific

MARKETING · MARKETING

Surveys, conversations, contacts, companies, and custom fields in the workspace they connected.

Acts as the person, not as itself

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

Credentials never touch the agent

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

Every call on the record

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

What an agent can do

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

specific_mutation_create_companyWRITE

Create a company from `data` (CompanyCreateInput: id, name, attributes). `id` IS YOUR OWN IDENTIFIER and is how every other company tool addresses it afterwards, so choose it deliberately and do not reuse one. Custom-field values go in `attributes`, keyed by the names specific_query_custom_fields lists -- note the provider's own written example calls this field `customFields`, which the schema does not have. Creating a company that already exists is a ValidationError; use specific_mutation_create_or_update_company when either outcome is fine. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_create_conversationWRITE

Record a conversation -- a piece of customer feedback -- in the workspace. `data.content` is REQUIRED and is Specific's `Content` scalar: either a plain string or a ProseMirror document object ({type: 'doc', content: [...]}). Everything else is optional: `customFields` (a map of custom-field values), `insertedAt` (a date or full timestamp -- omit and the provider stamps now), `sourceUrl`, and four RELATION arguments that attach or create the related records in the same call -- `company` and `contact` take connect-or-connectOrCreate, `source` takes connect only, and `assignee` takes connectOrIgnore keyed on an account email. THIS IS THE INGEST TOOL: it is the one write that creates the feedback the rest of the product reads. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_create_or_update_companyWRITE

Upsert a company: `where` (CompanyAttributeFilter -- by `id`, or by matching `attributes`) selects it, `data` (CompanyUpdateInput) is applied, and it is created when nothing matches. ATTRIBUTES MERGE, they do not replace: the provider's own reference says 'It will merge current values with new ones', so a key you omit keeps its previous value and the way to clear one is specific_mutation_delete_company_attributes. Answers a LIST of companies, because an attribute filter can match more than one. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_create_or_update_userWRITE

Upsert a contact: `where` (ContactIdAndEmailFilter -- `id` or `email`) selects it, `data` (ContactUpdateInput) is applied, and it is created when nothing matches. ATTRIBUTES MERGE rather than replace, so an omitted key keeps its previous value. Answers a LIST of contacts. A `where` naming neither id nor email matches nothing, which is why both are checked before the call. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_create_userWRITE

Create a contact from `data` (ContactCreateInput: id, name, email, attributes, company). `id` is your own identifier and is how the other contact tools address it. `company.connect.id` attaches an EXISTING company -- this input has no create arm, so create the company first. Creating a contact that already exists is a ValidationError; use specific_mutation_create_or_update_user when either outcome is fine. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_delete_companyWRITE

DESTRUCTIVE AND IRREVERSIBLE: permanently delete the company named by `where.id`. Nothing here restores it, and Specific publishes no sandbox -- this runs against the live workspace. The contacts and conversations attached to it are not named by this call and the reference does not say what becomes of that relation, so read the company's contacts first if that matters. Answers the deleted Company; a null answer means no company with that id, which is surfaced as a 404 rather than as a successful no-op. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_delete_company_attributesWRITE

DESTRUCTIVE AND IRREVERSIBLE: permanently clear the named custom-field values on one company. `where.id` is the company and `data.keys` is a required, non-empty list of custom-field names (the names specific_query_custom_fields lists). This is the ONLY way to clear a custom- field value: the update tools merge, so omitting a key leaves it alone. The custom-field DEFINITION is not deleted, only this company's values. A null answer means no company with that id and is surfaced as a 404. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_delete_userWRITE

DESTRUCTIVE AND IRREVERSIBLE: permanently delete the contact named by `where` (`id` or `email`). Nothing here restores it and Specific publishes no sandbox. A `where` naming neither field matches nothing, so both are checked before the call rather than letting an empty filter reach a delete. Answers the deleted User; a null answer means no such contact and is surfaced as a 404. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_delete_user_attributesWRITE

DESTRUCTIVE AND IRREVERSIBLE: permanently clear the named custom-field values on one contact. `where` is the contact (`id` or `email`) and `data.keys` is a required, non-empty list of custom-field names. This is the ONLY way to clear a contact's custom-field value -- the update tools merge. The custom-field definition itself is untouched. A null answer means no such contact and is surfaced as a 404. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_subscribe_webhookWRITE

Create or update a webhook subscription. `data.url` is the endpoint Specific will POST to, `data.operation` is a required non-empty list of event names -- new-survey-response, new-user, new-contact, new-conversation -- and `data.code` is the shared secret Specific sends so your endpoint can tell a real delivery from anyone else's POST. `data.sources` narrows a 'new- conversation' subscription to particular source ids. THE URL IS THE KEY: subscribing the same url again REPLACES that subscription rather than adding a second one, which is what 'Create or update webhook' means. Answers the Webhook with `inactive`/`inactiveReason` -- a webhook Specific has given up delivering to comes back with those populated, and that is the field to check when deliveries stop. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_unsubscribe_webhookWRITE

DESTRUCTIVE: remove the webhook subscription for `where.url`. Event delivery to that endpoint stops immediately and the events that would have been delivered in the meantime are not replayed when it is subscribed again. Re- creating it needs the secret `code` again, which this tool does not return. A null answer means no subscription for that url and is surfaced as a 404 rather than as a successful no-op. (The provider's reference mislabels this field 'Create webhook'; it is the unsubscribe.) Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_update_companyWRITE

Update the companies matched by `where` (CompanyAttributeFilter -- by `id`, or by matching `attributes`) with `data`. ATTRIBUTES MERGE rather than replace, so an omitted key keeps its value and clearing one needs specific_mutation_delete_company_attributes. Unlike the upsert, this does NOT create a company when nothing matches: a null answer means nothing matched and is surfaced as a 404. Answers a LIST, because an attribute filter can match more than one -- check what came back rather than assuming one. Specific publishes no rate limit for this API; nothing here retries.

api
specific_mutation_update_userWRITE

Update the contacts matched by `where` (ContactIdAndEmailFilter -- `id` or `email`) with `data`. ATTRIBUTES MERGE rather than replace; clearing one needs specific_mutation_delete_user_attributes. Unlike the upsert, this does NOT create a contact when nothing matches: a null answer means nothing matched and is surfaced as a 404. Answers a LIST of contacts. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_companiesREAD

List the workspace's companies, each with its id, name, usersCount and the internal visitorId. Narrow with `where`, a CompanyFilter whose `id` and `name` are StringFilters (equals/contains/startsWith/in/...). Omit `where` for all of them. THE SCHEMA DECLARES NO PAGINATION on this field -- no first/after/limit argument and no connection wrapper -- so the provider decides how many come back and there is no cursor to follow. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_conversationsREAD

List conversations with their content, custom fields, source, company, contact and assignee. THE PROVIDER CAPS THIS AT THE LAST 20 -- its own reference states 'List the last 20 conversation.' and the schema offers no first/after/limit argument, so there is no way to page further back through this API. Narrow with `where: {sources: [id, ...]}`, the source ids from the Sources tool. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_custom_fieldsREAD

List the custom fields defined in the workspace, each with its id, name and type. THE NAMES HERE ARE THE KEYS every `attributes` and `customFields` map on the write tools is addressed by, so call this before inventing one. Filter by `type` -- company, contact or conversation. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_my_workspaceREAD

The workspace the connected personal API key belongs to: its id and name. Takes no arguments. This is the cheapest call that proves the credential works -- it is the one field measured to answer 401 without a key, where the bare introspection query does not. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_sourcesREAD

List the workspace's sources -- the channels conversations are gathered from -- with their id and name. The ids are what the conversation filter and `createConversation`'s `source.connect` take. Takes no arguments. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_surveyREAD

One survey by id, with its context and tone and EVERY response conversation: each conversation's id, createdAt, finishedAt and isCompleted, plus the full chat transcript (question id, question text and the respondent's answer, in order). This is the tool that reads survey results. The schema types the answer nullable, so a survey id that does not exist answers 404 here rather than an empty success. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_surveysREAD

Every survey in the workspace, each with its context, tone and full response transcripts. Takes no arguments and THE SCHEMA OFFERS NO PAGINATION, so this returns all of them with all of their conversations -- on a busy workspace that is a large answer, and specific_query_survey is the narrower read once you have an id. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api
specific_query_usersREAD

List the workspace's contacts (the schema calls the type `User`; the product calls them contacts), each with id, name, email, the internal visitorId and the company they belong to. Narrow with `where`, a ContactFilter whose `id` and `email` are StringFilters and whose `attributes` matches custom-field values. THE SCHEMA DECLARES NO PAGINATION on this field. Reads only; changes nothing. Specific publishes no rate limit for this API; nothing here retries.

api

Put Specific behind one governed endpoint.

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