# Customers

Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.

## List Customers

> Retrieve project customers with optional search, tag, sort, facet filters, and calendar bounds on a chosen datetime column.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers":{"get":{"tags":["Customers"],"summary":"List Customers","operationId":"listCustomers","description":"Retrieve project customers with optional search, tag, sort, facet filters, and calendar bounds on a chosen datetime column.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"array","description":"Response payload for the request.","items":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"location_id":{"type":"integer","description":"Unique numeric identifier for the location."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"color":{"type":"string","description":"Hex color associated with the resource."},"name":{"type":"string","description":"Display name for this resource."},"first_name":{"type":"string","description":"Customer first name."},"last_name":{"type":"string","description":"Customer last name."},"email":{"type":"string","description":"Email address for the person or customer."},"phone":{"type":"string","description":"Phone number for the person or customer."},"phone_formatted":{"type":"string","description":"Human-readable formatted phone number."},"phone_e164":{"type":"string","description":"Phone number normalized to E.164 format."},"company":{"type":"string","description":"Company or organization name associated with the customer."},"gravatar":{"type":"string","description":"Gravatar image URL for the email address."},"lang":{"type":"string","description":"Preferred language code."},"notes":{"type":"string","description":"Internal notes about the customer."},"has_subscription":{"type":"boolean","description":"Whether the customer has an active subscription flag."},"charges_count":{"type":"integer","description":"Number of charge records associated with the customer."},"charges_sum":{"type":"integer","description":"Total amount charged to the customer in the smallest currency unit."},"charges_avg":{"type":"integer","description":"Average charge amount for the customer in the smallest currency unit."},"review_link":{"type":"string","description":"Public link used by the customer to leave a review."},"unsubscribe_link":{"type":"string","description":"Link the customer can use to unsubscribe from outreach."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."},"validation":{"type":"object","description":"Mailgun email validation verdict returned by the API; only normalized result and risk fields from the stored payload.","properties":{"result":{"type":"string","nullable":true,"description":"Mailgun address-validation result type when a verdict is stored.","enum":["catch_all","deliverable","do_not_send","undeliverable","unknown"]},"risk":{"type":"string","nullable":true,"description":"Mailgun aggregate risk level when a verdict is stored.","enum":["high","low","medium","unknown"]}}},"is_validated":{"type":"boolean","nullable":true,"description":"Tri-state suitability for outreach after validation—null when no verdict applies, true when the Mailgun result is deliverable, unknown, or catch-all, and false otherwise (including undeliverable and do-not-send)."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."},"signed_up_at":{"type":"integer","description":"Unix timestamp when the customer signed up."},"first_charged_at":{"type":"integer","description":"Unix timestamp of the customer's first charge."},"last_charged_at":{"type":"integer","description":"Unix timestamp of the customer's most recent charge."},"first_asked_at":{"type":"integer","description":"Unix timestamp of the first review request sent to the customer."},"last_asked_at":{"type":"integer","description":"Unix timestamp of the most recent review request sent to the customer."},"first_messaged_at":{"type":"integer","description":"Unix timestamp of the first message sent to the customer."},"last_messaged_at":{"type":"integer","description":"Unix timestamp of the most recent message sent to the customer."},"first_reviewed_at":{"type":"integer","description":"Unix timestamp of the customer's first review."},"last_reviewed_at":{"type":"integer","description":"Unix timestamp of the customer's most recent review."},"unsubscribed_at":{"type":"string","description":"Unix timestamp when the customer unsubscribed, if applicable.","nullable":true},"archived_at":{"type":"string","description":"Unix timestamp when the customer was archived, if applicable.","nullable":true},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"updated_at":{"type":"integer","description":"Unix timestamp when this resource was last updated."},"photo":{"type":"object","description":"Customer profile image from ImageTransformer when present; omitted in JSON when the customer has no photo.","nullable":true,"properties":{"id":{"type":"integer","description":"Unique numeric identifier for the image record."},"link":{"type":"string","description":"Resolved CDN or app URL for the image asset."},"uuid":{"type":"string","description":"Stable UUID for the image record."}}}}}},"pagination":{"type":"object","description":"Pagination metadata for list responses.","properties":{"current_page":{"type":"integer","description":"Current page number in the paginated result set."},"from":{"type":"integer","description":"Index of the first item returned on the current page."},"last_page":{"type":"integer","description":"Last available page number in the paginated result set."},"path":{"type":"string","description":"Base API path used for the paginated result set."},"per_page":{"type":"integer","description":"Number of items returned per page."},"to":{"type":"integer","description":"Index of the last item returned on the current page."},"total":{"type":"integer","description":"Total number of matching items."}}}}}}}}},"parameters":[{"name":"date_from","in":"query","required":false,"schema":{"type":"string","format":"date","nullable":true,"description":"Inclusive lower calendar date (YYYY-MM-DD) for the column chosen by date_key, defaulting to created_at when date_key is omitted."},"description":"Inclusive lower calendar date (YYYY-MM-DD) for the column chosen by date_key, defaulting to created_at when date_key is omitted."},{"name":"date_key","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Customer datetime column paired with date_from and date_to (defaults to created_at when omitted).","enum":["archived_at","created_at","last_asked_at","last_charged_at","last_messaged_at","last_reviewed_at","signed_up_at","unsubscribed_at"]},"description":"Customer datetime column paired with date_from and date_to (defaults to created_at when omitted)."},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","format":"date","nullable":true,"description":"Inclusive upper calendar date (YYYY-MM-DD) for the column chosen by date_key; must be on or after date_from when both bounds are provided."},"description":"Inclusive upper calendar date (YYYY-MM-DD) for the column chosen by date_key; must be on or after date_from when both bounds are provided."},{"name":"email","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Email address for the person or customer."},"description":"Email address for the person or customer."},{"name":"filter","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Customer list facet aligned with console filters (excluding archived unless requested).","enum":["archived","asked","has-charges","has-notes","missed","not-asked","not-messaged","not-reviewed","reviewed","unsubscribed"]},"description":"Filter customers by lifecycle, engagement, or archive state."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Maximum number of records to return."},"description":"Maximum number of records to return."},{"name":"q","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Search query used to filter results."},"description":"Query."},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Sort direction: asc or desc.","enum":["asc","desc"]},"description":"Sort direction: asc or desc."},{"name":"sort_key","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Customer field to sort by.","enum":["first_name","last_name","email","company","created_at","signed_up_at","last_asked_at","last_messaged_at","last_reviewed_at"]},"description":"Customer field to sort by."},{"name":"tag_slug","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"URL-friendly identifier for the customer tag."},"description":"Filter customers by tag slug."}]}}}}
```

## Create Customer

> Create a customer record with contact, location, and tag details.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}},"schemas":{"ProjectApiDateTimeInput":{"description":"Optional instant for request bodies: Unix timestamp as integer (seconds), or a date/time string of at most\n50 characters that PHP Carbon can parse. For strings, ISO-8601 / RFC 3339 (for example 2026-04-28T15:30:00Z) is the\nrecommended format in examples and client integrations. Invalid values fail validation. When the field is omitted\nor null, the API uses the current server time where that behavior is documented on the operation.","nullable":true,"oneOf":[{"type":"integer","description":"Unix timestamp in seconds since the Unix epoch."},{"type":"string","maxLength":50,"description":"Date/time string parseable by Carbon; prefer ISO-8601 / RFC 3339; maximum 50 characters."}]}}},"paths":{"/customers":{"post":{"tags":["Customers"],"summary":"Create Customer","operationId":"createCustomer","description":"Create a customer record with contact, location, and tag details.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"location_id":{"type":"integer","description":"Unique numeric identifier for the location."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"color":{"type":"string","description":"Hex color associated with the resource."},"name":{"type":"string","description":"Display name for this resource."},"first_name":{"type":"string","description":"Customer first name."},"last_name":{"type":"string","description":"Customer last name."},"email":{"type":"string","description":"Email address for the person or customer."},"phone":{"type":"string","description":"Phone number for the person or customer."},"phone_formatted":{"type":"string","description":"Human-readable formatted phone number."},"phone_e164":{"type":"string","description":"Phone number normalized to E.164 format."},"company":{"type":"string","description":"Company or organization name associated with the customer."},"gravatar":{"type":"string","description":"Gravatar image URL for the email address."},"lang":{"type":"string","description":"Preferred language code."},"notes":{"type":"string","description":"Internal notes about the customer."},"has_subscription":{"type":"boolean","description":"Whether the customer has an active subscription flag."},"charges_count":{"type":"integer","description":"Number of charge records associated with the customer."},"charges_sum":{"type":"integer","description":"Total amount charged to the customer in the smallest currency unit."},"charges_avg":{"type":"integer","description":"Average charge amount for the customer in the smallest currency unit."},"review_link":{"type":"string","description":"Public link used by the customer to leave a review."},"unsubscribe_link":{"type":"string","description":"Link the customer can use to unsubscribe from outreach."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."},"validation":{"type":"object","description":"Mailgun email validation verdict returned by the API; only normalized result and risk fields from the stored payload.","properties":{"result":{"type":"string","nullable":true,"description":"Mailgun address-validation result type when a verdict is stored.","enum":["catch_all","deliverable","do_not_send","undeliverable","unknown"]},"risk":{"type":"string","nullable":true,"description":"Mailgun aggregate risk level when a verdict is stored.","enum":["high","low","medium","unknown"]}}},"is_validated":{"type":"boolean","nullable":true,"description":"Tri-state suitability for outreach after validation—null when no verdict applies, true when the Mailgun result is deliverable, unknown, or catch-all, and false otherwise (including undeliverable and do-not-send)."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."},"signed_up_at":{"type":"integer","description":"Unix timestamp when the customer signed up."},"first_charged_at":{"type":"integer","description":"Unix timestamp of the customer's first charge."},"last_charged_at":{"type":"integer","description":"Unix timestamp of the customer's most recent charge."},"first_asked_at":{"type":"integer","description":"Unix timestamp of the first review request sent to the customer."},"last_asked_at":{"type":"integer","description":"Unix timestamp of the most recent review request sent to the customer."},"first_messaged_at":{"type":"integer","description":"Unix timestamp of the first message sent to the customer."},"last_messaged_at":{"type":"integer","description":"Unix timestamp of the most recent message sent to the customer."},"first_reviewed_at":{"type":"integer","description":"Unix timestamp of the customer's first review."},"last_reviewed_at":{"type":"integer","description":"Unix timestamp of the customer's most recent review."},"unsubscribed_at":{"type":"string","description":"Unix timestamp when the customer unsubscribed, if applicable.","nullable":true},"archived_at":{"type":"string","description":"Unix timestamp when the customer was archived, if applicable.","nullable":true},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"updated_at":{"type":"integer","description":"Unix timestamp when this resource was last updated."},"photo":{"type":"object","description":"Customer profile image from ImageTransformer when present; omitted in JSON when the customer has no photo.","nullable":true,"properties":{"id":{"type":"integer","description":"Unique numeric identifier for the image record."},"link":{"type":"string","description":"Resolved CDN or app URL for the image asset."},"uuid":{"type":"string","description":"Stable UUID for the image record."}}},"location":{"type":"object","description":"Location for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"display_name":{"type":"string","description":"Public display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"code":{"type":"string","description":"Short code or application-level status code for this resource."},"title":{"type":"string","description":"Title or headline for the resource."},"address":{"type":"string","description":"Address for this resource."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."}}},"tags":{"type":"array","description":"Maximum or current allowance for tag records.","items":{"type":"object","description":"Maximum or current allowance for tag records.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"color":{"type":"string","description":"Hex color associated with the resource."}}}}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"first_name":{"type":"string","description":"Customer first name."},"last_name":{"type":"string","description":"Customer last name."},"email":{"type":"string","description":"Email address for the person or customer."},"phone":{"type":"string","description":"Phone number for the person or customer."},"company":{"type":"string","description":"Company or organization name associated with the customer."},"has_subscription":{"type":"boolean","description":"Whether the customer has an active subscription flag."},"location_slug":{"type":"string","description":"Slug of the location associated with the record."},"signed_up_at":{"$ref":"#/components/schemas/ProjectApiDateTimeInput"},"notes":{"type":"string","description":"Internal notes about the customer."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."},"tag_slugs":{"type":"array","description":"Tag slugs to attach to the customer.","items":{"type":"string","description":"Tag slugs to attach to the customer."}}},"required":["first_name"]}}}}}}}}
```

## Get Customer

> Retrieve one customer belonging to the authenticated project with nested location and tags where present.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}":{"get":{"tags":["Customers"],"summary":"Get Customer","operationId":"getCustomer","description":"Retrieve one customer belonging to the authenticated project with nested location and tags where present.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false},"description":"Unique numeric identifier for the customer."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."},"data":{"type":"object","description":"Customer record with optional nested entities."}}}}}}}}}}}
```

## Delete Customer

> Delete a customer from the authenticated project.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}":{"delete":{"tags":["Customers"],"summary":"Delete Customer","operationId":"deleteCustomer","description":"Delete a customer from the authenticated project.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## Archive Customer

> Archive a customer and cancel any unsent outreach messages.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/archive":{"put":{"tags":["Customers"],"summary":"Archive Customer","operationId":"archiveCustomer","description":"Archive a customer and cancel any unsent outreach messages.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## Unarchive Customer

> Restore an archived customer so asks and integrations treat them as active again.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/unarchive":{"put":{"tags":["Customers"],"summary":"Unarchive Customer","operationId":"unarchiveCustomer","description":"Restore an archived customer so asks and integrations treat them as active again.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## Update Customer Notes

> Replace the internal notes stored on a customer.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/notes":{"put":{"tags":["Customers"],"summary":"Update Customer Notes","operationId":"updateCustomerNotes","description":"Replace the internal notes stored on a customer.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body containing customer notes.","properties":{"notes":{"type":"string","nullable":true,"maxLength":5000,"description":"Internal notes about the customer."}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Unsubscribe Customer

> Unsubscribe a customer from future outreach and cancel unsent messages.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/unsubscribe":{"put":{"tags":["Customers"],"summary":"Unsubscribe Customer","operationId":"unsubscribeCustomer","description":"Unsubscribe a customer from future outreach and cancel unsent messages.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## Resubscribe Customer

> Clear message opt-out state so outreach can resume for this customer again.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/resubscribe":{"put":{"tags":["Customers"],"summary":"Resubscribe Customer","operationId":"resubscribeCustomer","description":"Clear message opt-out state so outreach can resume for this customer again.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## Cancel Customer Unsent Messages

> Clear scheduled outreach for this customer without archiving or changing subscription state.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/cancel-unsent-messages":{"put":{"tags":["Customers"],"summary":"Cancel Customer Unsent Messages","operationId":"cancelCustomerUnsentMessages","description":"Clear scheduled outreach for this customer without archiving or changing subscription state.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."}]}}}}
```

## List Customer Charges

> Paginated revenue-charge history for one customer after ingest from billing systems.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/charges":{"get":{"tags":["Customers"],"summary":"List Customer Charges","operationId":"listCustomerCharges","description":"Paginated revenue-charge history for one customer after ingest from billing systems.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"array","description":"Charge rows newest-first by charged-at timestamp.","items":{"type":"object","description":"Stored charge tied to this customer.","properties":{"amount":{"type":"integer","description":"Charge amount in the smallest currency unit."},"charged_at":{"type":"string","description":"RFC3339 timestamp when the charge occurred.","nullable":true},"currency":{"type":"string","description":"Three-letter ISO currency code.","nullable":true},"customer_id":{"type":"integer","description":"Unique numeric identifier for the customer who owns this charge."},"id":{"type":"integer","description":"Unique numeric identifier for this charge row."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project this charge belongs to.","nullable":true}}}},"pagination":{"type":"object","description":"Pagination metadata for list responses.","properties":{"current_page":{"type":"integer","description":"Current page number in the paginated result set."},"from":{"type":"integer","description":"Index of the first item returned on the current page."},"last_page":{"type":"integer","description":"Last available page number in the paginated result set."},"path":{"type":"string","description":"Base API path used for the paginated result set."},"per_page":{"type":"integer","description":"Number of items returned per page."},"to":{"type":"integer","description":"Index of the last item returned on the current page."},"total":{"type":"integer","description":"Total number of matching items."}}}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the customer."},"description":"Unique numeric identifier for the customer."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Maximum number of records to return per page."},"description":"Maximum number of records to return per page."}]}}}}
```

## List Customer Messages

> Retrieve message history for one customer in the project.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/customers/{id}/messages":{"get":{"tags":["Customers"],"summary":"List Customer Messages","operationId":"listCustomerMessages","description":"Retrieve message history for one customer in the project.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"array","description":"Response payload for the request.","items":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"ask_id":{"type":"integer","description":"Ask id for this resource."},"channel":{"type":"string","description":"Channel for this resource."},"failed_reason":{"type":"string","description":"Failed reason for this resource.","nullable":true},"scheduled_at":{"type":"integer","description":"Scheduled at for this resource."},"processed_at":{"type":"integer","description":"Processed at for this resource."},"sent_at":{"type":"integer","description":"Unix timestamp when the message was sent."},"delivered_at":{"type":"integer","description":"Delivered at for this resource."},"opened_at":{"type":"integer","description":"Opened at for this resource."},"clicked_at":{"type":"string","description":"Clicked at for this resource.","nullable":true},"failed_at":{"type":"string","description":"Failed at for this resource.","nullable":true},"complained_at":{"type":"string","description":"Complained at for this resource.","nullable":true},"canceled_at":{"type":"string","description":"Canceled at for this resource.","nullable":true},"halted_at":{"type":"string","description":"Halted at for this resource.","nullable":true},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"updated_at":{"type":"integer","description":"Unix timestamp when this resource was last updated."},"customer":{"type":"object","description":"Customer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"color":{"type":"string","description":"Hex color associated with the resource."},"gravatar":{"type":"string","description":"Gravatar image URL for the email address."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."},"unsubscribed_at":{"type":"string","description":"Unix timestamp when the customer unsubscribed, if applicable.","nullable":true}}},"template":{"type":"object","description":"Template for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"channel":{"type":"string","description":"Channel for this resource."}}}}}},"pagination":{"type":"object","description":"Pagination metadata for list responses.","properties":{"current_page":{"type":"integer","description":"Current page number in the paginated result set."},"from":{"type":"integer","description":"Index of the first item returned on the current page."},"last_page":{"type":"integer","description":"Last available page number in the paginated result set."},"path":{"type":"string","description":"Base API path used for the paginated result set."},"per_page":{"type":"integer","description":"Number of items returned per page."},"to":{"type":"integer","description":"Index of the last item returned on the current page."},"total":{"type":"integer","description":"Total number of matching items."}}}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this resource."},"description":"Unique numeric identifier for this resource."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Maximum number of records to return."},"description":"Maximum number of records to return."}]}}}}
```

## List Customer Reviews

> Retrieve review history for one customer in the project.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}},"schemas":{"SpriteClass":{"type":"string","maxLength":50,"pattern":"^(fab|fad|fak|fal|far|fas|fat)\\s+fa-[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Font Awesome icon: two CSS class names as used with Font Awesome Web Fonts / classic CSS (not SVG/React props).\nFormat is a style prefix (`fab`, `fad`, `fak`, `fal`, `far`, `fas`, or `fat`), one ASCII space, then an icon slug\nstarting with `fa-` (lowercase letters and digits, hyphen-separated words). Examples: `fab fa-google`, `fas fa-star`.\nOn write, omit, send null, or whitespace-only to clear. Font Awesome 6 semantic pairs such as `fa-solid fa-star`\nare not accepted; use `fas fa-star` instead."}}},"paths":{"/customers/{id}/reviews":{"get":{"tags":["Customers"],"summary":"List Customer Reviews","operationId":"listCustomerReviews","description":"Retrieve review history for one customer in the project.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"array","description":"Response payload for the request.","items":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"score":{"type":"integer","description":"Score for this resource."},"review":{"type":"string","description":"Review for this resource."},"review_html":{"type":"string","description":"Review html for this resource."},"reply":{"type":"string","description":"Reply text associated with the review or message."},"is_hidden":{"type":"boolean","description":"Is hidden for this resource."},"is_duplicate":{"type":"boolean","description":"Is duplicate for this resource."},"has_highlights":{"type":"boolean","description":"Has highlights for this resource."},"can_reply":{"type":"boolean","description":"Can reply for this resource."},"has_reply":{"type":"boolean","description":"Has reply for this resource."},"external_url":{"type":"string","description":"External url for this resource."},"platform_url":{"type":"string","description":"Absolute URL to this review in the web console; uses the agency white-label host when configured."},"replied_at":{"type":"integer","description":"Unix timestamp when a reply was posted."},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"customer":{"type":"object","description":"Customer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"color":{"type":"string","description":"Hex color associated with the resource."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."}}},"location":{"type":"object","description":"Location for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"display_name":{"type":"string","description":"Public display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"store_code":{"type":"string","description":"Internal store identifier for this location."},"title":{"type":"string","description":"Title or headline for the resource."},"address":{"type":"string","description":"Address for this resource."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."}}},"rating":{"type":"object","description":"Numeric rating value for the review.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"score":{"type":"integer","description":"Score for this resource."},"label":{"type":"string","description":"Label for this resource."}}},"reviewer":{"type":"object","description":"Reviewer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"name":{"type":"string","description":"Display name for this resource."},"photo_url":{"type":"string","description":"Photo url for this resource."}}},"source":{"type":"object","description":"Source system or review platform for this record.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"sprite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SpriteClass"}]},"color":{"type":"string","description":"Hex color associated with the resource."},"icon":{"type":"string","description":"Icon for this resource.","nullable":true}}},"fields":{"type":"array","description":"List of fields for this resource.","items":{"type":"object","description":"Fields for this resource.","properties":{"name":{"type":"string","description":"Display name for this resource."},"value":{"type":"string","description":"Stored value for this field."}}}},"tags":{"type":"array","description":"Maximum or current allowance for tag records.","items":{"type":"object","description":"Maximum or current allowance for tag records.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."}}}}}}},"pagination":{"type":"object","description":"Pagination metadata for list responses.","properties":{"current_page":{"type":"integer","description":"Current page number in the paginated result set."},"from":{"type":"integer","description":"Index of the first item returned on the current page."},"last_page":{"type":"integer","description":"Last available page number in the paginated result set."},"path":{"type":"string","description":"Base API path used for the paginated result set."},"per_page":{"type":"integer","description":"Number of items returned per page."},"to":{"type":"integer","description":"Index of the last item returned on the current page."},"total":{"type":"integer","description":"Total number of matching items."}}}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this resource."},"description":"Unique numeric identifier for this resource."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Maximum number of records to return."},"description":"Maximum number of records to return."}]}}}}
```

## Update Customer Tags

> Replace the tag assignments for a customer using the provided slug list.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Project customer records, nested outreach history, and lifecycle changes for integrations that sync people or dashboards.","name":"Customers"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}},"schemas":{"SpriteClass":{"type":"string","maxLength":50,"pattern":"^(fab|fad|fak|fal|far|fas|fat)\\s+fa-[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Font Awesome icon: two CSS class names as used with Font Awesome Web Fonts / classic CSS (not SVG/React props).\nFormat is a style prefix (`fab`, `fad`, `fak`, `fal`, `far`, `fas`, or `fat`), one ASCII space, then an icon slug\nstarting with `fa-` (lowercase letters and digits, hyphen-separated words). Examples: `fab fa-google`, `fas fa-star`.\nOn write, omit, send null, or whitespace-only to clear. Font Awesome 6 semantic pairs such as `fa-solid fa-star`\nare not accepted; use `fas fa-star` instead."}}},"paths":{"/customers/{id}/tags":{"put":{"tags":["Customers"],"summary":"Update Customer Tags","operationId":"updateCustomerTags","description":"Replace the tag assignments for a customer using the provided slug list.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body listing tag slugs to apply; omitting unrelated tags removes them from the customer.","properties":{"tag_slugs":{"type":"array","description":"Tag slugs to assign; send an empty array to clear all tags from this customer.","items":{"type":"string","description":"Project tag slug."}}},"required":["tag_slugs"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Unique numeric identifier for the customer."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."},"data":{"type":"object","description":"Customer record with assigned tags.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this customer."},"uuid":{"type":"string","description":"Stable UUID for this customer."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"name":{"type":"string","description":"Customer display name."},"first_name":{"type":"string","description":"Customer first name."},"last_name":{"type":"string","nullable":true,"description":"Customer last name."},"email":{"type":"string","description":"Customer email address."},"phone":{"type":"string","nullable":true,"description":"Customer phone number."},"company":{"type":"string","nullable":true,"description":"Company or organization associated with the customer."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."},"tags":{"type":"array","description":"Customer tags assigned to this customer.","items":{"type":"object","description":"Project tag metadata.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this tag."},"uuid":{"type":"string","description":"Stable UUID for this tag."},"name":{"type":"string","description":"Display name for this tag."},"slug":{"type":"string","description":"URL-friendly identifier for this tag."},"sprite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SpriteClass"}]},"color":{"type":"string","description":"Hex color associated with this tag."},"context":{"type":"string","description":"Resource type this tag applies to.","enum":["review","customer"]},"ai_instructions":{"type":"string","nullable":true,"description":"Instructions used by AI tagging for review tags."},"has_ai_tagging":{"type":"boolean","description":"Whether AI tagging is enabled for this tag."}}}}}}}}}}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.moregoodreviews.com/platform/api-reference/customers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
