MARKETING · MARKETING
WhatsApp templates, campaigns, and conversations from their own channel.
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.
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.
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.
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.
spoki_delete_api_1_campaigns_by_idWRITEDelete campaign via DELETE /api/1/campaigns/{id}/ -- rate limit 5/min
spoki_delete_api_1_contacts_by_idWRITEDelete contact via DELETE /api/1/contacts/{id}/ -- rate limit 120/min
spoki_delete_api_1_custom_fields_by_idWRITEDelete custom field via DELETE /api/1/custom-fields/{id}/ -- rate limit 5/min
spoki_delete_api_1_external_webhooks_by_idWRITEDelete webhook via DELETE /api/1/external-webhooks/{id}/ -- rate limit 30/min
spoki_delete_api_1_invitations_by_idWRITEDelete invitation via DELETE /api/1/invitations/{id}/ -- rate limit 10/min
spoki_delete_api_1_lists_by_idWRITEDelete list via DELETE /api/1/lists/{id}/ -- rate limit 5/min
spoki_delete_api_1_media_by_idWRITEDelete media via DELETE /api/1/media/{id}/ -- rate limit 60/min
spoki_delete_api_1_partner_invitations_by_idWRITEDelete invitation via DELETE /api/1/partner-invitations/{id}/ -- rate limit 10/min
spoki_delete_api_1_partner_roles_by_idWRITEDelete role via DELETE /api/1/partner-roles/{id}/ -- rate limit 5/min
spoki_delete_api_1_roles_by_idWRITEDelete role via DELETE /api/1/roles/{id}/ -- rate limit 5/min
spoki_delete_api_1_templates_by_idWRITEDelete template via DELETE /api/1/templates/{id}/ -- rate limit 10/min
spoki_delete_api_1_tickets_by_idWRITEDelete ticket via DELETE /api/1/tickets/{id}/ -- rate limit 60/min
spoki_get_api_1_accountsREADList, search, and filter accounts via GET /api/1/accounts/ -- rate limit 5/min
spoki_get_api_1_accounts_by_idREADRetrieve account via GET /api/1/accounts/{id}/ -- rate limit 5/min
spoki_get_api_1_accounts_by_id_current_reportREADCurrent report via GET /api/1/accounts/{id}/current_report/ -- rate limit 5/min
spoki_get_api_1_accounts_phone_by_phoneREADRetrieve account by phone via GET /api/1/accounts/phone/{phone}/ -- rate limit 5/min
spoki_get_api_1_agenciesREADList agencies via GET /api/1/agencies/ -- rate limit 5/min
spoki_get_api_1_agencies_by_idREADRetrieve agency via GET /api/1/agencies/{id}/ -- rate limit 5/min
spoki_get_api_1_automationsREADList, search, and filter automations via GET /api/1/automations/ -- rate limit 60/min
spoki_get_api_1_automations_by_idREADRetrieve automation via GET /api/1/automations/{id}/ -- rate limit 60/min
spoki_get_api_1_automations_by_id_custom_fields_usedREADCustom fields used via GET /api/1/automations/{id}/custom-fields-used/ -- rate limit 60/min
spoki_get_api_1_campaignsREADList, search, and filter campaigns via GET /api/1/campaigns/ -- rate limit 5/min
spoki_get_api_1_campaigns_by_idREADRetrieve campaign via GET /api/1/campaigns/{id}/ -- rate limit 5/min
spoki_get_api_1_channelREADList channels via GET /api/1/channel/
spoki_get_api_1_channel_by_id_channelREADRetrieve channel via GET /api/1/channel/{id_channel}/
spoki_get_api_1_channel_phone_by_identifierREADLookup channel by phone via GET /api/1/channel/phone/{identifier}/
spoki_get_api_1_contactsREADList, search, and filter contacts via GET /api/1/contacts/ -- rate limit 120/min
spoki_get_api_1_contacts_by_idREADRetrieve contact via GET /api/1/contacts/{id}/ -- rate limit 120/min
spoki_get_api_1_custom_fieldsREADList, search, and filter custom fields via GET /api/1/custom-fields/ -- rate limit 5/min
spoki_get_api_1_custom_fields_by_idREADRetrieve custom field via GET /api/1/custom-fields/{id}/ -- rate limit 5/min
spoki_get_api_1_external_webhooksREADList, search, and filter webhooks via GET /api/1/external-webhooks/ -- rate limit 30/min
spoki_get_api_1_external_webhooks_by_idREADRetrieve webhook via GET /api/1/external-webhooks/{id}/ -- rate limit 30/min
spoki_get_api_1_external_webhooks_by_id_expandsREADGet expands via GET /api/1/external-webhooks/{id}/expands/ -- rate limit 30/min
spoki_get_api_1_invitationsREADList, search, and filter invitations via GET /api/1/invitations/ -- rate limit 5/min
spoki_get_api_1_invitations_by_idREADRetrieve invitation via GET /api/1/invitations/{id}/ -- rate limit 5/min
spoki_get_api_1_listsREADList, search, and filter lists via GET /api/1/lists/ -- rate limit 5/min
spoki_get_api_1_lists_by_idREADRetrieve list via GET /api/1/lists/{id}/ -- rate limit 5/min
spoki_get_api_1_mediaREADList, search, and filter media via GET /api/1/media/ -- rate limit 10/min
spoki_get_api_1_media_by_idREADRetrieve media via GET /api/1/media/{id}/ -- rate limit 10/min
spoki_get_api_1_partner_invitationsREADList, search, and filter invitations via GET /api/1/partner-invitations/ -- rate limit 5/min
spoki_get_api_1_partner_invitations_by_idREADRetrieve invitation via GET /api/1/partner-invitations/{id}/ -- rate limit 5/min
spoki_get_api_1_partner_rolesREADList, search, and filter roles via GET /api/1/partner-roles/ -- rate limit 5/min
spoki_get_api_1_partner_roles_by_idREADRetrieve role via GET /api/1/partner-roles/{id}/ -- rate limit 5/min
spoki_get_api_1_partner_roles_by_id_has_private_keyREADHas Private Key via GET /api/1/partner-roles/{id}/has_private_key/ -- rate limit 10/min
spoki_get_api_1_partnersREADList, search and filter partners via GET /api/1/partners/
spoki_get_api_1_partners_accountsREADGet associated accounts via GET /api/1/partners/accounts/
spoki_get_api_1_partners_get_account_forecastsREADGet account forecasts via GET /api/1/partners/get_account_forecasts/
spoki_get_api_1_partners_get_account_reportREADGet account report via GET /api/1/partners/get_account_report/
spoki_get_api_1_reportsREADList, search, and filter reports via GET /api/1/reports/ -- rate limit 5/min -- DEPRECATED by Spoki: scheduled for removal on 2026-06-10 in favour of the richer GET /api/1/reports/detailed/ -- prefer that tool
spoki_get_api_1_reports_detailedREADList, search, and filter reports V2 via GET /api/1/reports/detailed/
spoki_get_api_1_rolesREADList, search, and filter roles via GET /api/1/roles/ -- rate limit 5/min
spoki_get_api_1_roles_by_idREADRetrieve role via GET /api/1/roles/{id}/ -- rate limit 5/min
spoki_get_api_1_roles_by_id_has_private_keyREADHas Private Key via GET /api/1/roles/{id}/has_private_key/ -- rate limit 10/min
spoki_get_api_1_tagsREADList, search, and filter tags via GET /api/1/tags/ -- rate limit 10/min
spoki_get_api_1_tags_by_idREADRetrieve tag via GET /api/1/tags/{id}/ -- rate limit 10/min
spoki_get_api_1_templatesREADList, search, and filter templates via GET /api/1/templates/
spoki_get_api_1_templates_by_idREADRetrieve template via GET /api/1/templates/{id}/
spoki_get_api_1_templates_by_id_cloneREADClone template via GET /api/1/templates/{id}/clone/ -- rate limit 10/min
spoki_get_api_1_ticketsREADList, search, and filter tickets via GET /api/1/tickets/ -- rate limit 10/min
spoki_get_api_1_tickets_by_idREADRetrieve ticket via GET /api/1/tickets/{id}/ -- rate limit 10/min
spoki_patch_api_1_campaigns_by_idWRITEUpdate campaign via PATCH /api/1/campaigns/{id}/ -- rate limit 5/min
spoki_patch_api_1_channel_by_id_channelWRITERename channel via PATCH /api/1/channel/{id_channel}/
spoki_patch_api_1_contacts_by_idWRITEUpdate a contact via PATCH /api/1/contacts/{id}/ -- rate limit 120/min -- accepts phone, first_name, last_name, email, language and custom_fields, or an is_blocked flag (true blocks the contact, false unblocks it)
spoki_patch_api_1_custom_fields_by_idWRITEUpdate custom field via PATCH /api/1/custom-fields/{id}/ -- rate limit 5/min
spoki_patch_api_1_external_webhooks_by_idWRITEUpdate webhook via PATCH /api/1/external-webhooks/{id}/ -- rate limit 30/min
spoki_patch_api_1_media_by_idWRITEUpdate media via PATCH /api/1/media/{id}/ -- rate limit 120/min
spoki_patch_api_1_templates_by_idWRITEUpdate template via PATCH /api/1/templates/{id}/ -- rate limit 10/min
spoki_patch_api_1_tickets_by_idWRITEUpdate ticket via PATCH /api/1/tickets/{id}/ -- rate limit 120/min
spoki_post_api_1_automationsWRITECreate Automation via POST /api/1/automations/ -- rate limit 60/min
spoki_post_api_1_campaignsWRITECreate campaign via POST /api/1/campaigns/ -- rate limit 5/min
spoki_post_api_1_channelWRITECreate channel via POST /api/1/channel/
spoki_post_api_1_channel_by_id_channel_refresh_wa_statusWRITERefresh WhatsApp phone status via POST /api/1/channel/{id_channel}/refresh-wa-status/
spoki_post_api_1_channel_by_id_channel_set_primaryWRITESet primary channel via POST /api/1/channel/{id_channel}/set-primary/
spoki_post_api_1_contacts_by_id_add_operatorWRITEAdd Operator via POST /api/1/contacts/{id}/add_operator/ -- rate limit 5/min
spoki_post_api_1_contacts_by_id_remove_operatorWRITERemove Operator via POST /api/1/contacts/{id}/remove_operator/ -- rate limit 5/min
spoki_post_api_1_contacts_syncWRITECreate or update contact via POST /api/1/contacts/sync/ -- rate limit 120/min
spoki_post_api_1_contacts_sync_allWRITESync contacts via POST /api/1/contacts/sync_all/ -- rate limit 1/min
spoki_post_api_1_custom_fieldsWRITECreate custom field via POST /api/1/custom-fields/ -- rate limit 5/min
spoki_post_api_1_external_webhooksWRITECreate webhook via POST /api/1/external-webhooks/
spoki_post_api_1_external_webhooks_by_id_expandsWRITESet expands via POST /api/1/external-webhooks/{id}/expands/ -- rate limit 30/min
spoki_post_api_1_external_webhooks_by_id_rotate_secretWRITERotate secret via POST /api/1/external-webhooks/{id}/rotate_secret/ -- rate limit 30/min
spoki_post_api_1_external_webhooks_by_id_testWRITESend test webhook via POST /api/1/external-webhooks/{id}/test/ -- rate limit 30/min
spoki_post_api_1_invitationsWRITEInvite new user by email via POST /api/1/invitations/ -- rate limit 10/min
spoki_post_api_1_invitations_by_id_sendWRITEResend invitation email via POST /api/1/invitations/{id}/send/ -- rate limit 5/min
spoki_post_api_1_invitations_by_id_update_roleWRITEUpdate role via POST /api/1/invitations/{id}/update_role/ -- rate limit 5/min
spoki_post_api_1_listsWRITECreate list via POST /api/1/lists/ -- rate limit 10/min
spoki_post_api_1_lists_by_id_remove_all_contactsWRITERemove all contacts via POST /api/1/lists/{id}/remove_all_contacts/
spoki_post_api_1_lists_by_id_remove_contactsWRITERemove contacts via POST /api/1/lists/{id}/remove_contacts/
spoki_post_api_1_lists_by_id_sync_contactsWRITECreate or update contacts, then add to the list via POST /api/1/lists/{id}/sync_contacts/ -- rate limit 1/min
spoki_post_api_1_mediaWRITECreate media via POST /api/1/media/ -- rate limit 120/min
spoki_post_api_1_messages_sendWRITESend a WhatsApp message via POST /api/1/messages/send/ -- rate limit 60/min -- set type=Template with a template id for a pre-approved template (optionally with buttons, a dynamic header_media, or a header_media_set carousel), or type=Message with content_type Text, Interactive (buttons) or List for a free-form message inside an open conversation; an optional channel_id routes through a specific channel, and omitting it resolves the account's primary compatible channel
spoki_post_api_1_partner_invitationsWRITEInvite new user by email via POST /api/1/partner-invitations/ -- rate limit 10/min
spoki_post_api_1_partner_invitations_by_id_sendWRITEResend invitation email via POST /api/1/partner-invitations/{id}/send/ -- rate limit 5/min
spoki_post_api_1_partner_invitations_by_id_update_roleWRITEUpdate role via POST /api/1/partner-invitations/{id}/update_role/ -- rate limit 5/min
spoki_post_api_1_partner_roles_by_id_update_roleWRITEUpdate Role via POST /api/1/partner-roles/{id}/update_role/ -- rate limit 10/min
spoki_post_api_1_partners_add_sv_clientsWRITEAdd Software Vendor Clients via POST /api/1/partners/add_sv_clients/
spoki_post_api_1_partners_create_conversations_subrechargeWRITECreate Conversations Subrecharge - Software Vendor Only - DEPRECATED via POST /api/1/partners/create_conversations_subrecharge/ -- DEPRECATED by Spoki and software-vendor only
spoki_post_api_1_partners_create_subrechargeWRITECreate Meta Credit Subrecharge via POST /api/1/partners/create_subrecharge/
spoki_post_api_1_partners_move_credit_from_accountWRITEMove Credit From Account - Software Vendor Only via POST /api/1/partners/move_credit_from_account/
spoki_post_api_1_partners_onboardingWRITECreate Onboarding Link via POST /api/1/partners/onboarding/
spoki_post_api_1_partners_set_profitsWRITESet Account Profit Margins - Software Vendor Only via POST /api/1/partners/set_profits/
spoki_post_api_1_roles_add_service_userWRITEAdd Service User via POST /api/1/roles/add_service_user/ -- rate limit 10/min
spoki_post_api_1_roles_by_id_update_roleWRITEUpdate Role via POST /api/1/roles/{id}/update_role/ -- rate limit 10/min
spoki_post_api_1_templatesWRITECreate template via POST /api/1/templates/
spoki_post_api_1_templates_by_id_back_to_draftWRITEBack template to Draft via POST /api/1/templates/{id}/back_to_draft/ -- rate limit 10/min
spoki_post_api_1_templates_by_id_submitWRITERequest template via POST /api/1/templates/{id}/submit/ -- rate limit 10/min
spoki_post_api_1_ticketsWRITECreate ticket via POST /api/1/tickets/ -- rate limit 120/min
spoki_post_wh_ap_by_uuidWRITEStart Automation via POST /wh/ap/{uuid}/ -- NOT CALLABLE on a Spoki connection: this trigger is addressed by a per-automation UUID minted in the Spoki dashboard and authenticated by a secret in its request body, not by the account API key, so it always refuses here
spoki_post_wh_ap_by_uuid_bulkWRITEStart Automation for many contacts via POST /wh/ap/{uuid}/bulk/ -- NOT CALLABLE on a Spoki connection: this trigger is addressed by a per-automation UUID minted in the Spoki dashboard and authenticated by a secret in its request body, not by the account API key, so it always refuses here
Put Spoki behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.