Deal partners
`/deal-partners`
One page of records, newest first unless you say otherwise, with the total count in meta so you know how far to paginate.
Required scope: deal-partners:read.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
page?integer1-based. meta.totalPages says how many there are.
1 <= value1per_page?integerRows per page. A value above 200 returns 400 - never a silent clamp.
1 <= value <= 20050sort?stringPrefix with - for descending. An undeclared sort returns 400.
"createdAt""createdAt""-createdAt""sharedAt""-sharedAt"q?stringCase-insensitive "contains", across: dealName.
filter[dealId]?stringExact match on dealId.
filter[partnerId]?stringExact match on partnerId.
filter[role]?stringExact match on role.
"referrer""subcontractor""reseller"filter[billingMode]?stringExact match on billingMode.
"we_invoice""partner_invoices"The requested page.
application/json- response
data*array<>meta*curl -X GET 'https://api.usedashly.com/v1/deal-partners'{ "data": [ { "id": "string", "dealId": "string", "dealName": "string", "partnerId": "string", "role": "referrer", "billingMode": "we_invoice", "compKind": "commission_pct", "compBase": "deal_total", "compBaseCents": 0, "commissionBps": 0, "amountCents": 0, "partnerInvoicedCents": 0, "partnerInvoicedShared": true, "sharedFields": null, "sharedAt": "2019-08-24T14:15:22Z", "createdAt": "2019-08-24T14:15:22Z" } ], "meta": { "page": 0, "perPage": 0, "total": 0, "totalPages": 0 }}Links are given as the target's public id (clientId: "hsbftmp3f5"); the API resolves them server-side. Fields the database requires but the interface decides for you are filled in the same way here.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
Idempotency-Key?stringA value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.
8 <= length <= 255application/json- body
dealId*string1 <= lengthpartnerId*string1 <= lengthrole*string"referrer""subcontractor""reseller"billingMode?string"we_invoice""partner_invoices"compKind?string"commission_pct""fixed_amount""none"compBase?string"deal_total""agency_share""custom"compBaseCents?|nullcommissionBps?|nullamountCents?|nullcreatedAt?stringWhen this actually happened, for an import. Past dates only; defaults to now. updatedAt follows it unless the body sets one.
date-timeCreated. The body is the new record, as a read would return it.
application/json- response
data*curl -X POST 'https://api.usedashly.com/v1/deal-partners' \ -H 'Content-Type: application/json' \ -d '{ "dealId": "string", "partnerId": "string", "role": "referrer"}'{ "data": { "id": "string", "dealId": "string", "dealName": "string", "partnerId": "string", "role": "referrer", "billingMode": "we_invoice", "compKind": "commission_pct", "compBase": "deal_total", "compBaseCents": 0, "commissionBps": 0, "amountCents": 0, "partnerInvoicedCents": 0, "partnerInvoicedShared": true, "sharedFields": null, "sharedAt": "2019-08-24T14:15:22Z", "createdAt": "2019-08-24T14:15:22Z" }}The full record, custom fields included when the resource carries them. A record from another agency is a 404, not a 403 - its existence is not ours to confirm.
Required scope: deal-partners:read.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
Found.
application/json- response
data*curl -X GET 'https://api.usedashly.com/v1/deal-partners/string'{ "data": { "id": "string", "dealId": "string", "dealName": "string", "partnerId": "string", "role": "referrer", "billingMode": "we_invoice", "compKind": "commission_pct", "compBase": "deal_total", "compBaseCents": 0, "commissionBps": 0, "amountCents": 0, "partnerInvoicedCents": 0, "partnerInvoicedShared": true, "sharedFields": null, "sharedAt": "2019-08-24T14:15:22Z", "createdAt": "2019-08-24T14:15:22Z" }}A partial update: only the fields you send change. One exception - customFields is replaced wholesale, not merged, so sending it with a single key clears the others. Read the record, merge, then write.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
application/json- body
role?string"referrer""subcontractor""reseller"billingMode?string"we_invoice""partner_invoices"compKind?string"commission_pct""fixed_amount""none"compBase?string"deal_total""agency_share""custom"compBaseCents?|nullcommissionBps?|nullamountCents?|nullUpdated. The body is the record as it now stands.
application/json- response
data*curl -X PATCH 'https://api.usedashly.com/v1/deal-partners/string' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": { "id": "string", "dealId": "string", "dealName": "string", "partnerId": "string", "role": "referrer", "billingMode": "we_invoice", "compKind": "commission_pct", "compBase": "deal_total", "compBaseCents": 0, "commissionBps": 0, "amountCents": 0, "partnerInvoicedCents": 0, "partnerInvoicedShared": true, "sharedFields": null, "sharedAt": "2019-08-24T14:15:22Z", "createdAt": "2019-08-24T14:15:22Z" }}Permanent. The audit log keeps the trace; the record does not come back.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
Deleted. Empty body.
curl -X DELETE 'https://api.usedashly.com/v1/deal-partners/string'Every verb this resource answers to, with its target and the JSON Schema of its body - the same contracts this document describes, readable at runtime.
Required scope: deal-partners:read.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
The available verbs.
application/json- response
data*array<>curl -X GET 'https://api.usedashly.com/v1/deal-partners/actions'{ "data": [ { "name": "string", "label": "string", "description": "string", "target": "item", "readOnly": true, "path": "string", "input": {} } ]}Opens the deal to the partner - stamping sharedAt - and notifies their team. email additionally invites that address, naming the deal in the invitation. Calling again does not notify again.
Does what the dashboard's sharePartnerDealAction does - same implementation, so the two cannot diverge.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.
Idempotency-Key?stringA value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.
8 <= length <= 255application/json- body
email?string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200name?stringlength <= 120Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/deal-partners/string/actions/share' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}Removes the partner's access to the deal and tells them. Their terms - role, commission - are kept.
Does what the dashboard's unsharePartnerDealAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.
Idempotency-Key?stringA value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/deal-partners/string/actions/unshare'{ "data": null}Replaces the list of fields this partner can see on this deal. Any key you leave out is hidden, and the partner is notified when the deal is already open to them.
Does what the dashboard's setSharedFieldsAction does - same implementation, so the two cannot diverge.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.
Idempotency-Key?stringA value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.
8 <= length <= 255application/json- body
fields*array<>Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/deal-partners/string/actions/set-shared-fields' \ -H 'Content-Type: application/json' \ -d '{ "fields": [ "deal.name" ]}'{ "data": null}Returns the people already invited or active at this partner, plus the address suggested for inviting a new one - null when that address is already on the list.
Does what the dashboard's getPartnerContactStateAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: deal-partners:write.
bearerAuthAuthorizationBearer <token>Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.
id*stringThe public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.
Idempotency-Key?stringA value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/deal-partners/string/actions/contact-state'{ "data": null}