Download OpenAPI specification:
Use the Jebbit API to automate tasks relating to your Businesses, Campaigns,
Product Feeds, Launch Links, and Integrations. All requests and responses follow
the JSON:API specification using the
application/vnd.api+json content type.
Use the client_id and client_secret provided by Jebbit in the
Auth endpoint to generate an access_token. This token is a
JSON Web Token (JWT) and is valid for 24 hours. After
expiry you must request a new one.
Include the token in every API request via the Authorization header:
Authorization: Bearer <your access_token here>
Multi-business tokens: If your access_token has scopes for multiple
businesses, you must send an x-jebbit-business header with every request.
The value is the target business ID — this sets the scope of the request.
By default every collection endpoint returns all of the records your business owns in a single response, and that remains the behaviour when no page parameters are sent — existing integrations do not need to change.
Where an endpoint supports paging, send page[number] (counting from 1) and
page[size] to request a slice instead. page[size] may not exceed 1000.
GET /api/v1/campaigns and GET /api/v1/campaign_stats support paging today; the
remaining collections are small enough that they always return whole.
GET /api/v1/campaigns additionally supports filter[launched] and
filter[title_contains], which is usually a better way to find what you need than
paging through the account.
API requests are subject to rate limiting. Contact Jebbit support for your plan's limits.
When using the Integrations endpoint to receive Jebbit webhooks, keep the following in mind. We also provide an Example Webhook Client Repo as a quickstart.
You can send a test webhook to your endpoint to verify connectivity and the signature verification flow before going live.
Important: Jebbit sends an x-jebbit-test header with every test webhook.
Your application should discard these and not process them through your data
ingestion pipeline.
Every webhook includes an x-jebbit-signature header so you can verify it
originated from Jebbit. The signature has the format:
x-jebbit-signature: t=<timestamp>,v1=<hmac>
Step 1 — Validate the timestamp. Ensure the timestamp is within a reasonable threshold (e.g., 5 minutes) of the current time to guard against replay attacks:
if timestamp < Time.now.to_i - 300
raise StandardError, 'Timestamp outside of tolerance'
end
Step 2 — Verify the HMAC. Reconstruct the signed payload and compare:
generated_payload = "#{timestamp}.#{request.body}"
calculated_hmac = Base64.strict_encode64(
OpenSSL::HMAC.digest('sha256', shared_secret, generated_payload)
)
ActiveSupport::SecurityUtils.secure_compare(hmac, calculated_hmac)
If the HMACs match, accept the payload as valid and continue processing.
Exchange your API credentials for a JWT bearer token. The returned token must be included in the Authorization header of all subsequent requests. Tokens are scoped to the business associated with the given credentials.
API credentials to authenticate with.
| client_id required | string Your API client identifier, found in the Jebbit dashboard under API settings. |
| client_secret required | string Your API client secret. Keep this value confidential. |
{- "client_id": "aBcDeFgHiJkLmNoPqRsT",
- "client_secret": "s3cr3t-k3y-v4lu3"
}{- "data": {
- "type": "tokens",
- "attributes": {
- "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzY29wZSI6InJlYWQ6YnVzaW5lc3M6bXliaXoifQ.signature",
- "token_type": "Bearer",
- "scope": "read:business:mybiz"
}
}
}Returns the business account associated with the authenticated API token. Use this endpoint to verify your credentials and retrieve your business ID.
{- "data": {
- "id": "abc123",
- "type": "businesses",
- "attributes": {
- "name": "Jebbit Business"
}
}
}Returns all campaigns belonging to the authenticated business. Each campaign includes its title, launch date, and active iteration.
| filter[launched] | boolean Example: filter[launched]=true
|
| filter[title_contains] | string Example: filter[title_contains]=Product Quiz Return only campaigns whose title contains this string, case-insensitive. LIKE wildcards ( |
| page[number] | integer >= 1 Example: page[number]=2 Which page to return, counting from 1. Omit both page parameters to receive the whole collection in one response, which is the default behaviour. |
| page[size] | integer [ 1 .. 1000 ] Example: page[size]=100 How many records per page. Omit both page parameters to receive the whole collection in one response, which is the default behaviour. |
curl https://api2.jebbit.com/api/v1/campaigns \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/vnd.api+json"
{- "data": [
- {
- "id": "abc123",
- "type": "campaigns",
- "attributes": {
- "title": "Summer Product Quiz",
- "launch_date": "2024-06-15T18:35:53.371Z",
- "active_iteration": "ajH"
}
}, - {
- "id": "def567",
- "type": "campaigns",
- "attributes": {
- "title": "Holiday Gift Finder",
- "launch_date": "2024-11-01T18:35:53.371Z",
- "active_iteration": "K6n"
}
}
]
}Returns a single campaign by its public ID, including its title, launch date, and the identifier for its currently active iteration.
| campaign_id required | string Example: def567 The public ID of the campaign to retrieve. |
{- "data": {
- "id": "def567",
- "type": "campaigns",
- "attributes": {
- "title": "Holiday Gift Finder",
- "launch_date": "2024-11-01T18:35:53.371Z",
- "active_iteration": "K6n"
}
}
}Returns all launch links associated with a campaign. Launch links are trackable URLs used to distribute the campaign across channels such as email, social media, and owned web properties.
| campaign_id required | string Example: abc123 The public ID of the campaign whose launch links to retrieve. |
{- "data": [
- {
- "id": "abC1234",
- "type": "launch_links",
- "attributes": {
- "created_at": "2024-01-17T19:37:47.151Z",
- "custom_param_value": "JC=Product+Quiz+LP",
- "enabled": true,
- "label": "Product Quiz LP",
- "link_group": "Owned Web",
- "link_parameter": "L=Owned+Web",
- "include_uid_param": false,
}
}, - {
- "id": "def6789",
- "type": "launch_links",
- "attributes": {
- "created_at": "2024-01-10T18:58:35.791Z",
- "custom_param_value": null,
- "enabled": true,
- "label": "Linkedin",
- "link_group": "Linkedin",
- "link_parameter": "L=Linkedin",
- "include_uid_param": false,
}
}
]
}Campaign performance for a date range, including the recommendation distribution and per-question drop-off.
Returns performance totals for every campaign in the brand. Campaigns with no activity in the range report zeros rather than being omitted, so the response shape is stable.
The per-outcome and per-question breakdowns are not included here - request a single campaign to get those. They are the expensive half of the resource and do not aggregate into anything useful across an account, so a brand with thousands of campaigns would pay for detail no caller can read. Use this endpoint to find the campaign worth looking at, then GET /api/v1/campaign_stats/{campaign_id} for what happened inside it.
| filter[start_date] | string <date> Example: filter[start_date]=2024-06-01 Only count activity on or after this ISO 8601 date (YYYY-MM-DD). |
| filter[end_date] | string <date> Example: filter[end_date]=2024-06-30 Only count activity on or before this ISO 8601 date (YYYY-MM-DD). |
| page[number] | integer >= 1 Example: page[number]=2 Which page to return, counting from 1. Omit both page parameters to receive the whole collection in one response, which is the default behaviour. |
| page[size] | integer [ 1 .. 1000 ] Example: page[size]=100 How many records per page. Omit both page parameters to receive the whole collection in one response, which is the default behaviour. |
{- "data": [
- {
- "id": "abc123",
- "type": "campaign_stats",
- "attributes": {
- "title": "Summer Product Quiz",
- "views": 56528,
- "loads": 56528,
- "engagements": 126,
- "completions": 57,
- "leads": 0,
- "redirects": 0,
- "opt_ins": 0,
- "responses": 458,
- "outcome_views": 0,
- "time_spent_seconds": 5238,
- "engagement_rate": 0.22,
- "completion_rate": 45.24,
- "lead_rate": 0
}
}
], - "meta": {
- "record_count": 3516
}
}Returns performance for a single campaign, including which recommendations respondents were shown and where they dropped off question by question. This is the only endpoint that returns those breakdowns; the collection endpoint reports totals only.
| campaign_id required | string Example: abc123 The public ID of the campaign. |
| filter[start_date] | string <date> Example: filter[start_date]=2024-06-01 Only count activity on or after this ISO 8601 date (YYYY-MM-DD). |
| filter[end_date] | string <date> Example: filter[end_date]=2024-06-30 Only count activity on or before this ISO 8601 date (YYYY-MM-DD). |
{- "data": {
- "id": "abc123",
- "type": "campaign_stats",
- "attributes": {
- "title": "Summer Product Quiz",
- "views": 56528,
- "loads": 56528,
- "engagements": 126,
- "completions": 57,
- "leads": 0,
- "redirects": 0,
- "opt_ins": 0,
- "responses": 458,
- "outcome_views": 0,
- "time_spent_seconds": 5238,
- "engagement_rate": 0.22,
- "completion_rate": 45.24,
- "lead_rate": 0,
- "outcomes": [
- {
- "id": "bkt123",
- "name": "Hydrating Serum",
- "count": 100
}
], - "questions": [
- {
- "name": "Skin type",
- "resource_type": "Question",
- "reached": 1000,
- "answered": 800,
- "dropped_off": 200,
- "response_rate": 80
}
]
}
}
}List every integration configured for the brand, across all services, and see how each one maps and transforms campaign data on its way out.
Returns every integration configured for the brand, across all services, with its destination, field mappings and injected static values. Read-only. Includes integrations provisioned outside the Jebbit dashboard, marked by dashboard_managed - those still receive data. For creating and managing webhook subscriptions, see /api/v1/webhook_integrations.
{- "data": [
- {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "klaviyo_standard",
- "name": "Klaviyo - main list",
- "is_active": true,
- "attached_at": "brand",
- "dashboard_managed": true,
- "send_in_preview": false,
- "endpoint_host": "a.klaviyo.com",
- "region": "us",
- "require_opt_in": false,
- "include_uids": true,
- "include_mapped_attributes": true,
- "options": {
- "hash_pii": true,
- "include_all_attributes": true
}, - "mappings": [
- {
- "client_var": "email_address",
- "jebbit_var": "email",
- "data_type": "string",
- "default": "unknown@example.com",
- "transformers": [
- "sha256"
]
}
], - "static_values": {
- "effective": {
- "event_source": "jebbit",
- "region_code": "NA"
}, - "by_level": {
- "integration": { },
- "brand": { },
- "campaign": { }
}
}
}
}
], - "meta": {
- "record_count": 3516
}
}Returns a single integration by its public ID.
| integration_id required | string Example: abc123 The public ID of the integration. |
{- "data": {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "klaviyo_standard",
- "name": "Klaviyo - main list",
- "is_active": true,
- "attached_at": "brand",
- "dashboard_managed": true,
- "send_in_preview": false,
- "endpoint_host": "a.klaviyo.com",
- "region": "us",
- "require_opt_in": false,
- "include_uids": true,
- "include_mapped_attributes": true,
- "options": {
- "hash_pii": true,
- "include_all_attributes": true
}, - "mappings": [
- {
- "client_var": "email_address",
- "jebbit_var": "email",
- "data_type": "string",
- "default": "unknown@example.com",
- "transformers": [
- "sha256"
]
}
], - "static_values": {
- "effective": {
- "event_source": "jebbit",
- "region_code": "NA"
}, - "by_level": {
- "integration": { },
- "brand": { },
- "campaign": { }
}
}
}
}
}Returns the campaigns explicitly linked to this integration. A brand-attached integration also fires for every other campaign in the account without appearing here - the integration's own attached_at field is what tells you that. Requires read:campaign, since the response contains campaigns.
| integration_id required | string Example: abc123 The public ID of the integration. |
{- "data": [
- {
- "id": "def567",
- "type": "campaigns",
- "attributes": {
- "title": "Summer Product Quiz",
- "launch_date": "2024-06-15T14:30:00.000Z",
- "active_iteration": "ajH",
- "integration_counts": {
- "total": 9,
- "direct": 1,
- "inherited": 8
}, - "uploader_counts": {
- "total": 2,
- "direct": 0,
- "inherited": 2
}
}
}
], - "meta": {
- "record_count": 3516
}
}Returns the integrations explicitly linked to this campaign. Brand-attached integrations apply to every campaign and are not returned here - the campaign's integration_counts reports them as inherited. Static values on this route resolve with the campaign level included. Requires read:integration, since the response contains integrations.
| campaign_id required | string Example: abc123 The public ID of the campaign. |
{- "data": [
- {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "klaviyo_standard",
- "name": "Klaviyo - main list",
- "is_active": true,
- "attached_at": "brand",
- "dashboard_managed": true,
- "send_in_preview": false,
- "endpoint_host": "a.klaviyo.com",
- "region": "us",
- "require_opt_in": false,
- "include_uids": true,
- "include_mapped_attributes": true,
- "options": {
- "hash_pii": true,
- "include_all_attributes": true
}, - "mappings": [
- {
- "client_var": "email_address",
- "jebbit_var": "email",
- "data_type": "string",
- "default": "unknown@example.com",
- "transformers": [
- "sha256"
]
}
], - "static_values": {
- "effective": {
- "event_source": "jebbit",
- "region_code": "NA"
}, - "by_level": {
- "integration": { },
- "brand": { },
- "campaign": { }
}
}
}
}
], - "meta": {
- "record_count": 3516
}
}Create, update and test webhook subscriptions. The only endpoints that return a credential (shared_secret), which you use to verify the signature on delivered payloads.
Returns all integrations configured for the authenticated business. Integrations define how and where Jebbit sends submission data (e.g., webhooks, CRM connectors).
{- "data": [
- {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "webhook",
- "region": "us",
- "shared_secret": "whsec_abc123def456",
- "include_uids": true,
- "require_opt_in": false,
- "include_mapped_attributes": true,
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-15T09:30:00.000Z"
}
}, - {
- "id": "def567",
- "type": "integrations",
- "attributes": {
- "service_name": "webhook",
- "region": "eu",
- "shared_secret": "whsec_ghi789jkl012",
- "include_uids": false,
- "require_opt_in": true,
- "include_mapped_attributes": false,
- "created_at": "2024-04-01T10:00:00.000Z",
- "updated_at": "2024-04-05T14:20:00.000Z"
}
}
]
}Creates a new integration for the authenticated business. Specify the endpoint URL, region, and any additional delivery options. The integration will begin receiving data once campaigns are configured to use it.
Integration configuration to create.
object |
{- "data": {
- "type": "integrations",
}
}{- "data": {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "webhook",
- "region": "us",
- "shared_secret": "whsec_abc123def456",
- "include_uids": true,
- "require_opt_in": false,
- "include_mapped_attributes": true,
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-10T12:00:00.000Z"
}
}
}Returns a single integration by its public ID, including its endpoint, service type, region, and configuration details.
| webhook_integration_id required | string Example: abc123 The public ID of the integration to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "webhook",
- "region": "us",
- "shared_secret": "whsec_abc123def456",
- "include_uids": true,
- "require_opt_in": false,
- "include_mapped_attributes": true,
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-15T09:30:00.000Z"
}
}
}Updates an existing integration's configuration. Only the provided attributes are modified; omitted attributes retain their current values.
| webhook_integration_id required | string Example: abc123 The public ID of the integration to update. |
Attributes to update on the integration. Only include fields you want to change.
object |
{
}{- "data": {
- "id": "abc123",
- "type": "integrations",
- "attributes": {
- "service_name": "webhook",
- "region": "us",
- "shared_secret": "whsec_abc123def456",
- "include_uids": true,
- "require_opt_in": false,
- "include_mapped_attributes": true,
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-20T16:45:00.000Z"
}
}
}Permanently deletes an integration and stops all future data deliveries to its endpoint. This action cannot be undone.
| webhook_integration_id required | string Example: abc123 The public ID of the integration to delete. |
{- "errors": [
- {
- "status": 401,
- "title": "Unauthorized Request"
}
]
}Sends a test payload to the integration's configured endpoint. Use this to verify connectivity and payload format before going live. The test submission contains sample data and does not affect production records.
| webhook_integration_id required | string Example: abc123 The public ID of the integration to test. |
{- "data": {
- "type": "integration_tests",
- "attributes": {
- "status": "sent"
}
}
}Returns all variable mappings across all integrations for the authenticated business. Each mapping defines how a Jebbit variable (e.g., an outcome or attribute) is mapped to a field in the external system.
{- "data": [
- {
- "id": "abc123",
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Bucket",
- "integration_id": "asdf1234",
- "default": "N/A"
}
}, - {
- "id": "def567",
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Bucket",
- "integration_id": "zmejas58",
- "default": null
}
}
]
}Creates a new variable mapping for an integration. The mapping defines which Jebbit variable (jebbit_var) corresponds to which field in the external system (client_var). The reserved value $metadata cannot be used as a jebbit_var.
The mapping to create, linking a Jebbit variable to an external field.
object |
{- "data": {
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Bucket",
- "integration_id": "asdf1234",
- "default": "N/A"
}
}
}{- "data": {
- "id": "abc123",
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Bucket",
- "integration_id": "asdf1234",
- "default": "Default"
}
}
}Returns a single integration mapping by its public ID, including the Jebbit variable, external field, and default value.
| integration_mapping_id required | string Example: abc123 The public ID of the integration mapping to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Bucket",
- "integration_id": "asdf1234",
- "default": "Default"
}
}
}Updates an existing integration mapping. Only the provided attributes are modified; omitted attributes retain their current values.
| integration_mapping_id required | string Example: abc123 The public ID of the integration mapping to update. |
Attributes to update on the mapping. Only include fields you want to change.
object |
{- "data": {
- "type": "integration_mappings",
- "attributes": {
- "client_var": "Updated Bucket"
}
}
}{- "data": {
- "id": "abc123",
- "type": "integration_mappings",
- "attributes": {
- "jebbit_var": "Outcome",
- "client_var": "Updated Bucket",
- "integration_id": "asdf1234",
- "default": "N/A"
}
}
}Permanently deletes an integration mapping. Future submissions will no longer include this variable in payloads sent to the integration.
| integration_mapping_id required | string Example: abc123 The public ID of the integration mapping to delete. |
{- "errors": [
- {
- "status": 401,
- "title": "Unauthorized Request"
}
]
}Returns all historic backfill jobs for the authenticated business. A backfill replays past submission data through an integration, useful when configuring a new integration for existing campaigns.
{- "data": [
- {
- "id": "abc123",
- "type": "integration_historic_backfills",
- "attributes": {
- "status": "processing",
- "integration_id": "asdf1234",
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-10T12:05:00.000Z"
}
}, - {
- "id": "def567",
- "type": "integration_historic_backfills",
- "attributes": {
- "status": "received",
- "integration_id": "zmejas58",
- "created_at": "2024-03-11T08:00:00.000Z",
- "updated_at": "2024-03-11T08:00:00.000Z"
}
}
]
}Triggers a new historic backfill job for an integration. This replays all past submission data through the specified integration. The integration must be active; backfills cannot be created for inactive integrations.
Specify which integration to run the historic backfill for.
object |
{- "data": {
- "type": "integration_historic_backfills",
- "attributes": {
- "integration_id": "asdf1234"
}
}
}{- "data": {
- "id": "abc123",
- "type": "integration_historic_backfills",
- "attributes": {
- "status": "processing",
- "integration_id": "asdf1234",
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-10T12:00:00.000Z"
}
}
}Returns a single historic backfill job by its public ID, including its current status (received, processing, completed, or failed).
| backfill_id required | string Example: abc123 The public ID of the backfill job to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "integration_historic_backfills",
- "attributes": {
- "status": "processing",
- "integration_id": "asdf1234",
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-10T12:05:00.000Z"
}
}
}Restarts a previously completed or failed backfill job. A backfill that is currently processing cannot be restarted — wait for it to complete or fail first.
| backfill_id required | string Example: abc123 The public ID of the backfill job to restart. |
Empty request body — send an empty JSON:API object to trigger the restart.
{ }{- "data": {
- "id": "abc123",
- "type": "integration_historic_backfills",
- "attributes": {
- "status": "processing",
- "integration_id": "asdf1234",
- "created_at": "2024-03-10T12:00:00.000Z",
- "updated_at": "2024-03-12T09:00:00.000Z"
}
}
}Scheduled exports of session data to SFTP, cloud storage or email, with their cadence, field selection and recent run history.
Returns every scheduled export configured for the brand - cadence, format, field selection, destination and the last ten runs, so you can see whether an export is still working. Credentials are never returned.
{- "data": [
- {
- "id": "upl123",
- "type": "uploaders",
- "attributes": {
- "upload_name": "Nightly session drop",
- "is_active": true,
- "data_set": "event",
- "output_type": "csv",
- "cadence": "8:00-daily",
- "timezone": "string",
- "region": "us",
- "filename": "JEBBIT_%y%m%d.csv",
- "separator": "|",
- "write_headers": true,
- "hash_pii": false,
- "exclude_pii": true,
- "require_completion": true,
- "headers": "SESSION_BASE_HEADERS",
- "excluded_headers": "string",
- "required_data": "string",
- "timestamp_format": "string",
- "attached_at": "brand",
- "destination": {
- "type": "sftp",
- "target": "sftp.client.example.com",
- "recipient_count": 0
}, - "recent_runs": [
- {
- "ran_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "status": "uploaded",
- "record_count": 1500
}
]
}
}
], - "meta": {
- "record_count": 3516
}
}Returns a single scheduled export by its public ID.
| uploader_id required | string Example: upl123 The public ID of the uploader. |
{- "data": {
- "id": "upl123",
- "type": "uploaders",
- "attributes": {
- "upload_name": "Nightly session drop",
- "is_active": true,
- "data_set": "event",
- "output_type": "csv",
- "cadence": "8:00-daily",
- "timezone": "string",
- "region": "us",
- "filename": "JEBBIT_%y%m%d.csv",
- "separator": "|",
- "write_headers": true,
- "hash_pii": false,
- "exclude_pii": true,
- "require_completion": true,
- "headers": "SESSION_BASE_HEADERS",
- "excluded_headers": "string",
- "required_data": "string",
- "timestamp_format": "string",
- "attached_at": "brand",
- "destination": {
- "type": "sftp",
- "target": "sftp.client.example.com",
- "recipient_count": 0
}, - "recent_runs": [
- {
- "ran_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "status": "uploaded",
- "record_count": 1500
}
]
}
}
}Returns the campaigns explicitly linked to this uploader. A brand-attached uploader also covers every other campaign in the account without appearing here - its attached_at field is what tells you that. Requires read:campaign.
| uploader_id required | string Example: upl123 The public ID of the uploader. |
{- "data": [
- {
- "id": "def567",
- "type": "campaigns",
- "attributes": {
- "title": "Summer Product Quiz",
- "launch_date": "2024-06-15T14:30:00.000Z",
- "active_iteration": "ajH",
- "integration_counts": {
- "total": 9,
- "direct": 1,
- "inherited": 8
}, - "uploader_counts": {
- "total": 2,
- "direct": 0,
- "inherited": 2
}
}
}
], - "meta": {
- "record_count": 3516
}
}Returns the scheduled exports explicitly linked to this campaign. Brand-attached uploaders cover every campaign and are not returned here - the campaign's uploader_counts reports them as inherited. Requires read:uploader.
| campaign_id required | string Example: abc123 The public ID of the campaign. |
{- "data": [
- {
- "id": "upl123",
- "type": "uploaders",
- "attributes": {
- "upload_name": "Nightly session drop",
- "is_active": true,
- "data_set": "event",
- "output_type": "csv",
- "cadence": "8:00-daily",
- "timezone": "string",
- "region": "us",
- "filename": "JEBBIT_%y%m%d.csv",
- "separator": "|",
- "write_headers": true,
- "hash_pii": false,
- "exclude_pii": true,
- "require_completion": true,
- "headers": "SESSION_BASE_HEADERS",
- "excluded_headers": "string",
- "required_data": "string",
- "timestamp_format": "string",
- "attached_at": "brand",
- "destination": {
- "type": "sftp",
- "target": "sftp.client.example.com",
- "recipient_count": 0
}, - "recent_runs": [
- {
- "ran_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "status": "uploaded",
- "record_count": 1500
}
]
}
}
], - "meta": {
- "record_count": 3516
}
}The attributes a brand collects. user_defined_id is the value an integration mapping's jebbit_var refers to.
Returns the brand's attributes. user_defined_id is the value an integration mapping's jebbit_var refers to, so it is how you join a mapping back to the attribute it reads. attribute_pass says whether the attribute travels to integrations.
Pass filter[user_defined_id] to resolve specific attributes rather than listing the brand's whole set - a comma-separated list returns one record per match. That is the cheap way to answer "which attribute does this mapping read".
| filter[user_defined_id] | string Example: filter[user_defined_id]=skin_concern,email Return only the attributes with these user_defined_ids. Comma-separate for several. Unmatched values are ignored rather than erroring, so a response can be shorter than the list requested. |
| page[number] | integer >= 1 Example: page[number]=1 Which page to return, counting from 1. Omit both page parameters to receive the whole collection. |
| page[size] | integer [ 1 .. 1000 ] Example: page[size]=100 How many records per page. Omit both page parameters to receive the whole collection. |
{- "data": [
- {
- "id": "trt123",
- "type": "traits",
- "attributes": {
- "user_defined_id": "skin_concern",
- "name": "Skin Concern",
- "rank": 3,
- "attribute_pass": true
}
}
], - "meta": {
- "record_count": 3516
}
}Returns a single attribute by its public ID.
| trait_id required | string Example: trt123 The public ID of the attribute. |
{- "data": {
- "id": "trt123",
- "type": "traits",
- "attributes": {
- "user_defined_id": "skin_concern",
- "name": "Skin Concern",
- "rank": 3,
- "attribute_pass": true
}
}
}Returns all data feeds for the authenticated business. Feeds are collections of structured data (e.g., product catalogs) used to power dynamic content in campaign experiences.
{- "data": [
- {
- "id": "abc123",
- "type": "feeds",
- "attributes": {
- "name": "Summer Products",
- "status": "uploaded",
- "source": "API",
- "version": "1234235234"
}
}, - {
- "id": "def567",
- "type": "feeds",
- "attributes": {
- "name": "Holiday Gift Guide",
- "status": "uploaded",
- "source": "Platform",
- "version": "1234567890"
}
}
]
}Creates a new data feed for the authenticated business. After creation, add columns and rows to populate the feed with data.
Feed details to create.
object |
{- "data": {
- "type": "feeds",
- "attributes": {
- "name": "Summer Products",
- "source": "API",
- "status": "uploaded"
}
}
}{- "data": {
- "id": "abc123",
- "type": "feeds",
- "attributes": {
- "name": "Summer Products",
- "version": "1234235234",
- "status": "uploaded",
- "source": "API"
}
}
}Returns a single feed by its public ID, including its name, source, and current status.
| feed_id required | string Example: abc123 The public ID of the feed to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "feeds",
- "attributes": {
- "name": "Summer Products",
- "version": "1234235234",
- "status": "uploaded",
- "source": "API"
}
}
}Updates an existing feed's metadata. Only the provided attributes are modified; omitted attributes retain their current values.
| feed_id required | string Example: abc123 The public ID of the feed to update. |
Attributes to update on the feed. Only include fields you want to change.
object |
{- "data": {
- "type": "feeds",
- "attributes": {
- "name": "Updated Products"
}
}
}{- "data": {
- "id": "abc123",
- "type": "feeds",
- "attributes": {
- "name": "Updated Products",
- "version": "1234235234",
- "status": "uploaded",
- "source": "API"
}
}
}Permanently deletes a feed and all of its columns and rows. This action cannot be undone. Campaigns referencing this feed will lose access to its data.
| feed_id required | string Example: abc123 The public ID of the feed to delete. |
{- "errors": [
- {
- "status": 401,
- "title": "Unauthorized Request"
}
]
}Returns all columns belonging to a specific feed. This is a convenience endpoint equivalent to filtering GET /api/v1/feed_columns by feed ID.
| feed_id required | string Example: abc123 The public ID of the feed whose columns to retrieve. |
{- "data": [
- {
- "id": "col001",
- "type": "feed_columns",
- "attributes": {
- "name": "Product Name",
- "feed_id": "abc123"
}
}, - {
- "id": "col002",
- "type": "feed_columns",
- "attributes": {
- "name": "Price",
- "feed_id": "abc123"
}
}
]
}Returns all rows belonging to a specific feed. This is a convenience endpoint equivalent to filtering GET /api/v1/feed_rows by feed ID.
| feed_id required | string Example: abc123 The public ID of the feed whose rows to retrieve. |
{- "data": [
- {
- "id": "row001",
- "type": "feed_rows",
- "attributes": {
- "feed_id": "abc123",
- "product_identifier": "SKU-001",
- "data": {
- "product_name": "Widget A",
- "price": "9.99"
}
}
}, - {
- "id": "row002",
- "type": "feed_rows",
- "attributes": {
- "feed_id": "abc123",
- "product_identifier": "SKU-002",
- "data": {
- "product_name": "Widget B",
- "price": "14.99"
}
}
}
]
}Returns feed columns filtered by one or more feed IDs. The filter[feed_id] query parameter is required and accepts an array of feed public IDs.
| filter[feed_id] required | Array of strings Example: filter[feed_id]=abc123&filter[feed_id]=def567 One or more feed public IDs to filter columns by. Only columns belonging to the specified feeds are returned. |
{- "data": [
- {
- "id": "abc123",
- "type": "feed_columns",
- "attributes": {
- "name": "Product Name",
- "feed_id": "def567"
}
}, - {
- "id": "def567",
- "type": "feed_columns",
- "attributes": {
- "name": "Price",
- "feed_id": "def567"
}
}
]
}Creates a new column within a feed. Columns define the schema of data that feed rows will contain (e.g., "Product Name", "Price", "Image URL").
Feed column details to create.
object |
{- "data": {
- "type": "feed_columns",
- "attributes": {
- "name": "Product Name",
- "feed_id": "def567"
}
}
}{- "data": {
- "id": "abc123",
- "type": "feed_columns",
- "attributes": {
- "name": "Product Name",
- "feed_id": "def567"
}
}
}Returns a single feed column by its public ID, including its name and the feed it belongs to.
| feed_column_id required | string Example: abc123 The public ID of the feed column to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "feed_columns",
- "attributes": {
- "name": "Product Name",
- "feed_id": "def567"
}
}
}Updates an existing feed column. Currently supports renaming the column. Only the provided attributes are modified.
| feed_column_id required | string Example: abc123 The public ID of the feed column to update. |
Attributes to update on the feed column.
object |
{- "data": {
- "type": "feed_columns",
- "attributes": {
- "name": "Updated Column Name",
- "feed_id": "def567"
}
}
}{- "data": {
- "id": "abc123",
- "type": "feed_columns",
- "attributes": {
- "name": "Updated Column Name",
- "feed_id": "def567"
}
}
}Permanently deletes a feed column. This removes the column definition from the feed schema. This action cannot be undone.
| feed_column_id required | string Example: abc123 The public ID of the feed column to delete. |
{- "errors": [
- {
- "status": 400,
- "title": "Bad Request"
}
]
}Returns feed rows filtered by one or more feed IDs. The filter[feed_id] query parameter is required and accepts an array of feed public IDs. Each row contains a data attribute with key-value pairs matching the feed's column schema.
| filter[feed_id] required | Array of strings Example: filter[feed_id]=abc123 One or more feed public IDs to filter rows by. Only rows belonging to the specified feeds are returned. |
{- "data": [
- {
- "id": "abc123",
- "type": "feed_rows",
- "attributes": {
- "feed_id": "def567",
- "product_identifier": "SKU-001",
- "data": {
- "product_name": "Widget A",
- "price": "9.99"
}
}
}, - {
- "id": "def567",
- "type": "feed_rows",
- "attributes": {
- "feed_id": "def567",
- "product_identifier": "SKU-002",
- "data": {
- "product_name": "Widget B",
- "price": "14.99"
}
}
}
]
}Creates a new data row within a feed. The data attribute should contain key-value pairs matching the feed's column schema. Each row must have a unique product_identifier within its feed.
Feed row data to create.
object |
{- "data": {
- "type": "feed_rows",
- "attributes": {
- "feed_id": "def567",
- "product_identifier": "SKU-12345",
- "data": {
- "product_name": "Widget A",
- "price": "9.99"
}
}
}
}{- "data": {
- "id": "abc123",
- "type": "feed_rows",
- "attributes": {
- "product_identifier": "SKU-12345",
- "feed_id": "def567",
- "data": {
- "product_name": "Widget A",
- "price": "9.99"
}
}
}
}Returns a single feed row by its public ID, including its product identifier and column data.
| feed_row_id required | string Example: abc123 The public ID of the feed row to retrieve. |
{- "data": {
- "id": "abc123",
- "type": "feed_rows",
- "attributes": {
- "product_identifier": "SKU-12345",
- "feed_id": "def567",
- "data": {
- "product_name": "Widget A",
- "price": "9.99"
}
}
}
}Updates an existing feed row's data. Only the provided attributes are modified; omitted attributes retain their current values.
| feed_row_id required | string Example: abc123 The public ID of the feed row to update. |
Attributes to update on the feed row.
object |
{- "data": {
- "type": "feed_rows",
- "attributes": {
- "feed_id": "def567",
- "product_identifier": "SKU-12345",
- "data": {
- "product_name": "Widget A",
- "price": "12.99"
}
}
}
}{- "data": {
- "id": "abc123",
- "type": "feed_rows",
- "attributes": {
- "product_identifier": "SKU-12345",
- "feed_id": "def567",
- "data": {
- "product_name": "Widget A",
- "price": "12.99"
}
}
}
}Permanently deletes a feed row. This action cannot be undone.
| feed_row_id required | string Example: abc123 The public ID of the feed row to delete. |
{- "errors": [
- {
- "status": 400,
- "title": "Bad Request"
}
]
}All error responses follow the JSON:API error format.
Each response body contains an errors array with one or more error objects.
| Status | Title | When |
|---|---|---|
| 400 | Bad Request | Missing or malformed request parameters |
| 401 | Unauthorized | Missing or expired bearer token |
| 403 | Forbidden | Insufficient permissions for this action |
| 404 | Not Found | Resource does not exist or belongs to another business |
| 422 | Unprocessable Entity | Semantic validation failure (e.g., reserved value) |
| 500 | Internal Server Error | Unexpected server-side failure |
Example error response:
{
"errors": [
{
"status": 400,
"title": "Bad Request",
"detail": "The 'name' field is required."
}
]
}
Handling errors in your integration:
detail field provides a human-readable explanation specific to the error.401 errors, request a new token via POST /api/v1/auth.500 errors, retry the request with exponential backoff.