API reference
Meta Conversions API Reference
Destination management, public measurement capture and visitor suppression.
Connect eligible storefront events to Meta
An optional Meta Conversions API destination can forward supported PageView, ViewContent, AddToCart, InitiateCheckout and authoritative Purchase events. Configure the destination, event set and test code, verify the connection, then inspect redacted event outcomes.
Destination readiness, queued work, provider acceptance, Events Manager visibility and advertising attribution are different states. A configured worker or successful HTTP request alone does not prove an event reached Meta or produced a conversion.
Advertising measurement is separate from email enrollment
Meta forwarding uses its existing advertising-measurement permission and respects the supported Global Privacy Control, Do Not Track and visitor suppression checks. Purchasing or joining a developer email list does not supply that advertising permission. Declining measurement must not block ordinary browsing or checkout.
When enabled and permitted, events can include event/time/URL, product or order value, currency, browser matching identifiers and hashed customer matching fields. Hashing is not anonymization. Keep destination tokens private. A disconnect stops pending forwarding and removes saved destination credentials and supported checkout measurement snapshots; it does not erase history already held by Meta.
This integration does not change GA4 behavior or email preferences. Provider-side processing follows the developer destination and applicable provider terms. Use the existing privacy-request procedure for account-related requests; no new universal retention or delivery promise is made.
SoundSync
Measurement operations
/api/developer/meta-capi
Read destination readiness and redacted delivery outcomes
- Auth
- Account Bearer JWT
- Scope
- settings.view and all-products scope for settings reads; settings.manage additionally required for saves, connection tests, replay and disconnect.
- Returns
- HTTP 200: destinationId, hasToken, mode, eventNames, testEventCode, verifiedAt, configured, encryptionReady, ready, workerEnabled, lastError, apiVersion, canManage, counts, lastSuccess, events.
Request, response and error reference
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string"
},
"hasToken": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"eventNames": {
"type": "array",
"items": {
"type": "string"
}
},
"testEventCode": {
"type": "string"
},
"verifiedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"configured": {
"type": "boolean"
},
"encryptionReady": {
"type": "boolean"
},
"ready": {
"type": "boolean"
},
"workerEnabled": {
"type": "boolean"
},
"lastError": {
"type": "string"
},
"apiVersion": {
"type": "string"
},
"canManage": {
"type": "boolean"
},
"counts": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"lastSuccess": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"event_name": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"type": "string"
},
"attempts": {
"type": "integer",
"minimum": 0
},
"replay_count": {
"type": "integer",
"minimum": 0
},
"explanation": {
"type": "string"
},
"canReplay": {
"type": "boolean"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/meta-capi
Save an encrypted Meta destination and permitted event set
- Auth
- Account Bearer JWT
- Scope
- settings.view and all-products scope for settings reads; settings.manage additionally required for saves, connection tests, replay and disconnect.
- Request fields
- destinationId: string (required)
- accessToken: string
- mode: disabled | testing | live
- testEventCode: string
- eventNames: array (required)
- Returns
- HTTP 200: destinationId, hasToken, mode, eventNames, testEventCode, verifiedAt, configured, encryptionReady, ready, workerEnabled, lastError, apiVersion, canManage, counts, lastSuccess, events.
- Notes
- An access token is required on initial setup. Save new/replaced credentials disabled, save an Events Manager test code, run the synthetic test, then inspect accepted/verified state before activation. testing requires testEventCode. Changing configuration cancels queued work for the old generation; history is not rerouted.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string",
"pattern": "^[0-9]{5,30}$"
},
"accessToken": {
"type": "string",
"writeOnly": true
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"testEventCode": {
"type": "string"
},
"eventNames": {
"type": "array",
"items": {
"type": "string",
"enum": [
"PageView",
"ViewContent",
"AddToCart",
"InitiateCheckout",
"Purchase"
]
}
}
},
"additionalProperties": true,
"required": [
"destinationId",
"eventNames"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string"
},
"hasToken": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"eventNames": {
"type": "array",
"items": {
"type": "string"
}
},
"testEventCode": {
"type": "string"
},
"verifiedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"configured": {
"type": "boolean"
},
"encryptionReady": {
"type": "boolean"
},
"ready": {
"type": "boolean"
},
"workerEnabled": {
"type": "boolean"
},
"lastError": {
"type": "string"
},
"apiVersion": {
"type": "string"
},
"canManage": {
"type": "boolean"
},
"counts": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"lastSuccess": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"event_name": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"type": "string"
},
"attempts": {
"type": "integer",
"minimum": 0
},
"replay_count": {
"type": "integer",
"minimum": 0
},
"explanation": {
"type": "string"
},
"canReplay": {
"type": "boolean"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/meta-capi
Disconnect forwarding and remove saved destination credentials
- Auth
- Account Bearer JWT
- Scope
- settings.view and all-products scope for settings reads; settings.manage additionally required for saves, connection tests, replay and disconnect.
- Returns
- HTTP 200: destinationId, hasToken, mode, eventNames, testEventCode, verifiedAt, configured, encryptionReady, ready, workerEnabled, lastError, apiVersion, canManage, counts, lastSuccess, events.
- Notes
- Cancels pending events and removes saved checkout measurement snapshots. Provider-side history is separate. No browser Pixel is installed by this operation.
Request, response and error reference
No request body fields are read by this operation.
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string"
},
"hasToken": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"eventNames": {
"type": "array",
"items": {
"type": "string"
}
},
"testEventCode": {
"type": "string"
},
"verifiedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"configured": {
"type": "boolean"
},
"encryptionReady": {
"type": "boolean"
},
"ready": {
"type": "boolean"
},
"workerEnabled": {
"type": "boolean"
},
"lastError": {
"type": "string"
},
"apiVersion": {
"type": "string"
},
"canManage": {
"type": "boolean"
},
"counts": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"lastSuccess": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"event_name": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"type": "string"
},
"attempts": {
"type": "integer",
"minimum": 0
},
"replay_count": {
"type": "integer",
"minimum": 0
},
"explanation": {
"type": "string"
},
"canReplay": {
"type": "boolean"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/meta-capi/test
Queue one explicitly synthetic connection test
- Auth
- Account Bearer JWT
- Scope
- settings.view and all-products scope for settings reads; settings.manage additionally required for saves, connection tests, replay and disconnect.
- Returns
- HTTP 200: destinationId, hasToken, mode, eventNames, testEventCode, verifiedAt, configured, encryptionReady, ready, workerEnabled, lastError, apiVersion, canManage, counts, lastSuccess, events.
- Notes
- Requires a saved destination/token and Events Manager test code. This queues an external test event; do not use as a harmless health read. HTTP success does not establish provider acceptance, Events Manager visibility or ad attribution. Inspect the returned event status after worker processing.
Request, response and error reference
No request body fields are read by this operation.
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string"
},
"hasToken": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"eventNames": {
"type": "array",
"items": {
"type": "string"
}
},
"testEventCode": {
"type": "string"
},
"verifiedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"configured": {
"type": "boolean"
},
"encryptionReady": {
"type": "boolean"
},
"ready": {
"type": "boolean"
},
"workerEnabled": {
"type": "boolean"
},
"lastError": {
"type": "string"
},
"apiVersion": {
"type": "string"
},
"canManage": {
"type": "boolean"
},
"counts": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"lastSuccess": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"event_name": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"type": "string"
},
"attempts": {
"type": "integer",
"minimum": 0
},
"replay_count": {
"type": "integer",
"minimum": 0
},
"explanation": {
"type": "string"
},
"canReplay": {
"type": "boolean"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/meta-capi/events/{eventId}/replay
Requeue a recent eligible failed event for the same destination
- Auth
- Account Bearer JWT
- Scope
- settings.view and all-products scope for settings reads; settings.manage additionally required for saves, connection tests, replay and disconnect.
- Returns
- HTTP 200: destinationId, hasToken, mode, eventNames, testEventCode, verifiedAt, configured, encryptionReady, ready, workerEnabled, lastError, apiVersion, canManage, counts, lastSuccess, events.
- Notes
- Only failed events with retained payload, fewer than three replays, current destination/generation, recent original time and no suppression are eligible. Replay preserves event identity/time and cannot bypass expiry or recipient restrictions.
Request, response and error reference
No request body fields are read by this operation.
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"destinationId": {
"type": "string"
},
"hasToken": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"disabled",
"testing",
"live"
]
},
"eventNames": {
"type": "array",
"items": {
"type": "string"
}
},
"testEventCode": {
"type": "string"
},
"verifiedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"configured": {
"type": "boolean"
},
"encryptionReady": {
"type": "boolean"
},
"ready": {
"type": "boolean"
},
"workerEnabled": {
"type": "boolean"
},
"lastError": {
"type": "string"
},
"apiVersion": {
"type": "string"
},
"canManage": {
"type": "boolean"
},
"counts": {
"type": "object",
"properties": {},
"additionalProperties": true
},
"lastSuccess": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"event_name": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"type": "string"
},
"attempts": {
"type": "integer",
"minimum": 0
},
"replay_count": {
"type": "integer",
"minimum": 0
},
"explanation": {
"type": "string"
},
"canReplay": {
"type": "boolean"
}
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/meta-capi/config
Resolve whether measurement is available on this public surface
- Auth
- Public request; operation-specific verification still applies
- Scope
- Request Origin must match the validated published/verified public URL and developer surface.
- Request fields
- url: string (required)
- storefrontSlug: string
- productId: integer
- bundleId: integer
- Returns
- HTTP 200: available, developerId.
- Notes
- Scope/configuration failures return available:false. Availability is not visitor permission, provider acceptance or a guarantee that an event will be forwarded.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"storefrontSlug": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"bundleId": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": true,
"required": [
"url"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"available": {
"type": "boolean"
},
"developerId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/meta-capi/events
Submit eligible public measurement without blocking storefront use
- Auth
- Public request; operation-specific verification still applies
- Scope
- Validated developer surface, explicit advertising-measurement consent, matching destination, visitor ID and no GPC/DNT/suppression.
- Request fields
- url: string (required)
- storefrontSlug: string
- productId: integer
- bundleId: integer
- eventType: string (required)
- metadata: object
- adMeasurement: object (required)
- Returns
- HTTP 202: ok.
- Notes
- Maps supported page/product/cart activity to PageView/ViewContent/AddToCart. 202 ok:true deliberately does not disclose whether an event was retained or sent. Purchase capture is authoritative server checkout accounting, not a caller-supplied Purchase event. Email marketing enrollment is not advertising consent.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"storefrontSlug": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"bundleId": {
"type": "integer",
"minimum": 1
},
"eventType": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"action": {
"type": "string"
}
},
"additionalProperties": true
},
"adMeasurement": {
"type": "object",
"properties": {
"developerId": {
"type": "integer",
"minimum": 1
},
"visitorId": {
"type": "string",
"format": "uuid"
},
"eventId": {
"type": "string",
"format": "uuid"
},
"consent": {
"type": "boolean"
},
"fbp": {
"type": "string"
},
"fbc": {
"type": "string"
},
"fbclid": {
"type": "string"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"required": [
"url",
"eventType",
"adMeasurement"
]
}
HTTP 202 response (application/json)
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/meta-capi/privacy
Suppress the relevant visitor measurement and cancel pending work
- Auth
- Public request; operation-specific verification still applies
- Scope
- Validated public origin/developer surface and visitor identifier; cannot opt another developer into forwarding.
- Request fields
- url: string (required)
- storefrontSlug: string
- productId: integer
- bundleId: integer
- visitorId: string (required)
- Returns
- HTTP 200: ok.
- Notes
- Records the scoped measurement suppression when the surface resolves. Does not control GA4 or email lists. An unresolved surface can return ok:true without a suppression; a storage failure returns 503 and should be retried.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"storefrontSlug": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"bundleId": {
"type": "integer",
"minimum": 1
},
"visitorId": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": true,
"required": [
"url",
"visitorId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
