# Automate the Marketing Portal

Manage Marketing Portal data and publishing workflows with a Space-scoped API token.

Grant the [Marketing scopes](/developers/authentication#marketing) your integration needs. [Check entitlement](/api/operations/getDeveloperMarketingEntitlement) for features and limits.

## Manage email signatures

[List generators](/api/operations/listMarketingSignatures) for the ID and [read the draft](/api/operations/getMarketingSignature) for its revision. Send the complete configuration and current revision to [replace the draft](/api/operations/updateMarketingSignature). Refresh the draft after a revision conflict.

Use `marketing:signatures:manage` to [create a generator](/api/operations/createMarketingSignature), rename it, or delete it. Use `marketing:signatures:publish` to [publish](/api/operations/publishMarketingSignature) or unpublish at the current revision. Changing a published slug requires both scopes.

[Connect a custom hostname](/api/operations/connectMarketingSignatureDomain) and follow the DNS instructions. [Verify it](/api/operations/verifyMarketingSignatureDomain) before sharing its link.

## Manage Microsoft 365 signatures

Start the connection in the Portal as a Space owner or admin. A Microsoft administrator grants tenant consent. Outlook employee requests use Microsoft identity.

[Check the connection](/api/operations/getDeveloperMicrosoft365Status) and [read the policy revision](/api/operations/getDeveloperMicrosoft365Policy). Use separate grants to [save](/api/operations/saveDeveloperMicrosoft365Policy), [preview](/api/operations/previewDeveloperMicrosoft365Signature), and [publish](/api/operations/publishDeveloperMicrosoft365Policy). Directory synchronization, sender grants, and audit events have their own scopes.

Each Microsoft 365 connection shares **30 previews per minute** and **3 sync queue requests per minute** across the API and Portal. After you [queue a sync](/api/operations/queueDeveloperMicrosoft365Sync), check the connection status for progress. These connection allowances apply alongside the [Developer API quotas](/developers/authentication#request-quotas).

## Work with the brand kit

[Read the brand kit](/api/operations/getDeveloperMarketingBrandKit) for profile and asset IDs. Remove a profile's assets before deleting it.

[Upload a brand asset](/api/operations/uploadDeveloperMarketingBrandAsset) as image bytes, up to 2 MiB, with a matching `Content-Type`. Examples read `DASHIO_UPLOAD_FILE`. Persist an `Idempotency-Key` for profile changes and uploads. Use the asset read scope to [download files](/api/operations/getDeveloperMarketingBrandAsset).

## Build and manage tracked links

[Read the UTM workspace](/api/operations/getDeveloperMarketingUtmWorkspace) with `collection` set to `campaigns` (default), `links`, or `presets`. [Preview a tracked URL](/api/operations/previewDeveloperMarketingUtmUrl) before saving it.

For each [UTM change](/api/operations/mutateDeveloperMarketingUtmWorkspace), persist an `Idempotency-Key`. Retry with the same key and body within seven days. Reusing the key with another body returns **409**.

## Generate QR codes and inspect sites

[Generate a QR code](/api/operations/generateDeveloperMarketingQr) for an HTTP or HTTPS URL. The encoded URL preserves its query and fragment. An optional inline logo must be a complete static PNG, JPEG, or WebP image of up to 2 MiB decoded and 512 pixels per side. Reuse the returned SVG when the URL and design are unchanged.

[Inspect an authorized Space hostname](/api/operations/runDeveloperMarketingInspection) using a public HTTP or HTTPS URL on its default port. Omit the query and credentials. Saving inspection history requires `marketing:inspections:save`.

The Space's Marketing plan also sets shared minute and UTC-day allowances for QR generation and inspection across the API and Portal. [Read the Marketing overview](/api/operations/getDeveloperMarketingPortalOverview) for the current plan allowances. QR generation shares the API's hourly rendering quota with Microsoft 365 previews. Site inspection has its own hourly quota. On **429**, honor `Retry-After` before retrying.

## Read subscription status

[Read the Signatures subscription](/api/operations/getDeveloperMarketingSubscription) or [scheduled plan change](/api/operations/getDeveloperMarketingScheduledPlanChange). Use the Portal for checkout and billing changes.
