generated: '2026-08-13' method: generated source: openapi/*.yml (17 refined AppConnect V3 specs) + conventions/, errors/, rate-limits/, scopes/ provider: Constant Contact providerId: constant-contact description: >- Packaged Agent Skills for the Constant Contact V3 API. Each skill covers one marquee flow and is grounded in operationIds that exist in the published contract — no invented endpoints. The cross-cutting rules each skill repeats (no idempotency key, PUT is full-replace, 4 req/sec with no rate-limit headers, no engagement webhooks, three different error envelopes) come from conventions/constant-contact-conventions.yml and errors/constant-contact-problem-types.yml. provider_published: false provider_published_note: >- Constant Contact publishes no AGENTS.md, no skills directory and no llms.txt entry naming its API surface. These skills are generated by API Evangelist from the provider's own contract and documentation. api: name: Constant Contact V3 API base_url: https://api.cc.email/v3 auth: OAuth2 bearer (JWT), scopes contact_data / campaign_data / account_read / account_update / offline_access skills: - name: constant-contact-subscribe-contact file: constant-contact-subscribe-contact.md description: Add or update a contact and put them on lists via the opt-in sign-up path. scopes: [contact_data] operations: [getLists, createOrUpdateContact, getContacts, getContact, createContact, putContact] - name: constant-contact-send-email-campaign file: constant-contact-send-email-campaign.md description: Create a campaign, set content and audience on its primary activity, test, and schedule the send. scopes: [campaign_data, contact_data] operations: [createEmailCampaignUsingPOST, retrieveEmailCampaignUsingGET, retrieveEmailCampaignActivityUsingGET, updateEmailCampaignActivityUsingPUT, retrieveEmailCampaignActivityPreviewUsingGET, testSendCampaignActivityUsingPOST, scheduleEmailCampaignActivityUsingPOST, unscheduleEmailCampaignActivityUsingDELETE, retrieveEmailSendHistoryUsingGET] human_in_the_loop: >- scheduled_date "0" sends immediately and cannot be undone. Requires explicit confirmation. - name: constant-contact-bulk-import-contacts file: constant-contact-bulk-import-contacts.md description: Import, export or bulk-modify contacts through the asynchronous activities API and poll to completion. scopes: [contact_data] operations: [bulkImportContactsJSON, contactsCSVImport, postContactsExport, getContactsExport, getActivity, getActivityStatusCollection, postContactDelete, postListAddContact, postListRemoveContact, postTagAddContact, postTagRemoveContact] human_in_the_loop: >- postContactDelete and postListDelete are irreversible from the API. - name: constant-contact-report-campaign-performance file: constant-contact-report-campaign-performance.md description: Pull email and SMS campaign performance and per-contact engagement, budgeting the poll against the daily quota. scopes: [campaign_data, contact_data] operations: [getAllBulkEmailCampaignSummaries, getEmailSummary, getEmailCampaignActivitySummary, getCampaignActivityLinkStats, getSends, getOpens, getUniqueOpens, getDidNotOpens, getClicks, getForwards, getOptouts, getBounces, getContactTracking, getContactOpenClickRate, getContactTrackingCount, getAllBulkSmsCampaignSummaries] shared_rules: - The campaign_activity_id, not the campaign_id, keys content, audience and every report. - PUT is a full replace on contacts and campaign activities; read-merge-write or lose fields. - No idempotency key exists on any of the 128 operations; retried POSTs duplicate or 409. - 4 requests/second and 10,000/day per application, with no rate-limit headers and no Retry-After. Branch on error_key — throttled clears in a second, quota_exceeded not until 00:00 UTC. - No contact or campaign event webhooks; only four partner billing topics. Everything else is polling. - Errors come back in three different shapes — see errors/constant-contact-problem-types.yml. - A 403 conflates missing scope, missing user privilege and a deactivated application.