#Accept & Activate
Another tenant wants you to use their workflow, app spec or data. They put it in a manifest and offer it to your tenant. This guide is your side: review the offer, accept it, check what you received, then activate it. Activation is your tenant's use of a shared definition: your configuration, your triggers and integrations, your policies, running entirely in your tenant.
The owner's resources stay read-only for you. Nothing of theirs is copied into your tenant, and they can withdraw at any time. The owner's side is in Share with Another Tenant. What a share lets you do is in Shares & Grants.
Authenticate with a Personal Access Token (HTTP Basic auth). Enter it once in the Authorize bar above and every Try it below uses it.
| Step | Who can do it in your tenant |
|---|---|
| Review offers and shares | Any caller |
| Accept or decline | A tenant admin, using a token that is not bound to a policy |
| Activate a workflow | A caller allowed to create this tenant's workflow configuration |
| Activate an app | A caller allowed to write this tenant's app configuration |
#1. Find what's offered to you
GET/access/manifestsList offers made to your tenant (direction=incoming)API docs ↗Try it
Pass direction=incoming. Each manifest has the owner's tenant_id, its
name, description, members, and publication: your offer, with its
status (offered or accepted). Offers you declined, and offers the owner
withdrew, are not listed.
Until you accept, a member's resource_name is null. The names of the owner's
resources are not visible to you yet. To see exactly what you'd receive, with
names, read the resolved view:
GET/access/manifests/{manifestId}/resolvedReview everything the offer would shareAPI docs ↗Try it
Each element is one resource (resource_type, resource_id, resource_name,
resource_version, permitted_actions) with a provenance that says why it's
included. See Preview the effect.
#2. Accept or decline
Nothing is shared until you accept. Before that, a shared workflow can't be
activated (404), a shared app can't be activated (403, "App spec is not
visible to this tenant."), and the owner's resources read as not found.
PUT/access/manifests/{manifestId}/acceptanceAccept the offerAPI docs ↗Try it
The response has manifest_id, publication_id, status and accepted_at.
Every resource in the offer is shared with your tenant as soon as the call
returns.
- The answer always applies to your own offer. Nobody else can accept for your tenant, and that includes the owner.
- Sending the same answer again returns it unchanged.
- Decline with
{ "status": "declined" }. This removes everything the offer shared. A declined offer is dropped from your incoming list, and the manifest reads as404for you. You can still change your mind and accept later. - Read your standing answer at any time, including after you declined or the owner withdrew:
GET/access/manifests/{manifestId}/acceptanceYour answer to the offerAPI docs ↗Try it
| Status | What it means for you |
|---|---|
offered |
Listed as incoming. You can read the manifest and /resolved. Nothing is shared |
accepted |
Everything in /resolved is shared with you. If the owner changes the manifest, you get the change right away |
declined |
Not listed, and the manifest reads 404. Nothing is shared. You can still accept |
revoked |
The owner withdrew it. Not listed, and nothing is shared. Answering is refused with 422 (PUBLICATION_REVOKED) until the owner offers it again |
When the owner offers a withdrawn or declined manifest again, it comes back as
offered and you must accept it again. Your activations are kept and work again
once you have accepted.
With no offer addressed to your tenant, both acceptance calls answer 404
(details.code PUBLICATION_NOT_OFFERED).
#3. Check what you received
GET/access/sharesList what's shared with you (direction=inbound)API docs ↗Try it
Pass direction=inbound. Each row is one resource shared with your tenant:
resource_type, resource_id, the owner as grantor_tenant_id,
permitted_actions, and sources[]. Each source names the manifest
(manifest_id, manifest_name) and publication behind the share, and its
provenance. A resource offered by two manifests you accepted appears once,
with two sources.
Find each resource with the usual endpoints:
- Workflows appear in
GET /definition/workflowswith"source_type": "shared". - App specs are not listed by
GET /definition/specs. Fetch one by id withGET /definition/specs/{id}, using theresource_idfrom the share. - Entity types, JSON schemas and job versions read by id, like your own. A
shared entity type's attribute schema is readable too. A shared job appears in
GET /definition/jobswith"source_type": "shared", and only the version the owner listed is readable.
#4. Prepare
A shared definition may need three things from your tenant before it runs:
- Secrets. A definition never holds a credential: it reads a config key,
and you wire that key to a secret stored in your tenant, for example
"API_KEY": "{{ secrets.tenant.PARTNER_API_KEY }}"in a workflow'senv(see Secrets). Store each value first:
POST/access/secretsStore a secret your config will referenceAPI docs ↗Try it
- Configuration. A workflow may need
envvalues from you, and an app may needconfigvalues. When a definition names a config schema, your values are validated against it. See Config Schemas. If a value is missing or invalid, activation fails, and the error details say which values are wrong. So you can safely attempt activation and read the response. - An external company (apps only). Each app integration belongs to one. See Provisioning.
#5. Activate a workflow
One call creates your tenant's configuration and starts the workflow:
POST/workflows/{id}/activateActivate a shared workflow in your tenantAPI docs ↗Try it
For a workflow you don't own, this answers 404 ("Workflow not found.") unless
you have accepted a manifest that shares it. The response is your operating
state:
- The workflow, with
source_type: "shared"and the owner'sowner_tenant_id. - Triggers, with their webhook URLs and cron schedules, live immediately.
- Webhook signing secrets, for webhook triggers whose definition declares
verification. These are returned once, in the response that created them. Store them straight away. Afterwards you can only rotate them. - The applied policy. By default the workflow runs under the policy its
definition declares, or your role-based access when it declares none. Pass
policy_id, or an inlinepolicy, to run it under your own.
Manage it afterwards:
PUT/workflows/{id}/configUpdate your tenant's env overlayAPI docs ↗Try it
GET/workflows/{id}/triggersList your live triggersAPI docs ↗Try it
GET /workflows/{id}/configreturns yourenv, your ownjob_bindings, andjob_bindings_detail: what each referenced job resolves to, and at which level.- Every config write merges. A key you send is set, a key sent as
nullis unset, and a key you don't mention keeps its value. So a write carrying onlyjob_bindingsnever disturbs your env. If another admin changed the config between your read and your write, the server re-applies your change over theirs. If it can't, you get a409: read the config again and retry. - Point a referenced job at a different job with
PATCH /workflows/{id}/config/job-bindings, by job id. See Job Bindings. Activation and config writes refuse a state that couldn't run, so a bad binding fails here rather than at 3am. - Pause or resume a trigger with
PUT /workflows/{id}/triggers/{triggerId}/disableor…/enable. - Rotate a webhook secret with
POST /workflows/{id}/triggers/{triggerId}/secret, or re-activate with"regenerate_secrets": "all". Revoke it withDELETE.
#6. Activate an app
There is no separate activate call for apps. Creating your app config is the
activation, and name is required the first time:
PUT/apps/{specId}/configActivate a shared app (create your app config)API docs ↗Try it
For a spec you don't own, this answers 403 ("App spec is not visible to this
tenant.") unless you have accepted a manifest that shares it.
The spec's own access policy is applied for you (policy_source: "spec"). Pass
policy_id, or an inline policy, to use your own instead. Applying the policy
is reported as policy_sync_status on your app config. Read it back with
GET /apps/{specId}/config and check for "synced".
Then set up how the app is used:
- Integrations: one per external company that uses the app.
POST/apps/{specId}/integrationsAdd an integration for an external companyAPI docs ↗Try it
- Bearer tokens, for providers that authenticate with a token:
PUT /apps/{specId}/integrations/{integrationId}/tokenwith aname. The raw token is returned once. While one is active, another call answers409. Add?rotate=trueto revoke it and issue a new one. - Job bindings: an app's
jobsteps name keys. Bind a key to a different job for your tenant withPATCH /apps/{specId}/config/job-bindings(a job id orname@version), or for one integration withPATCH /apps/{specId}/integrations/{integrationId}/job-bindings(a job id). Unlike a workflow, an app is not checked at activation: an unbound key surfaces when the step runs. See Job Bindings. - Principal overlays: per-company, per-team or per-user config, merged over the spec's own values for that scope.
PUT/apps/{specId}/principals/{type}/{principalId}Set a principal's config overlayAPI docs ↗Try it
For the company tier, your own tenant is the company, so pass the self
sentinel as {principalId}. An integration's external_company_id is not a
principal id. self also works for user (you). team needs an explicit team
id.
- App roles: list the spec's roles with
GET /apps/{specId}/policies, and assign one withPUT /apps/{specId}/users/{authUserId}/policy.
Full app-surface detail: Apps.
#The owner's data in your tenant
- Your own rows of a shared entity type need nothing more. Store and query them like any of your data.
- The owner's rows are shared only when the manifest lists them (an
entitymember). Even then, a share makes them visible to your tenant, not to every user in it. A principal reads them through a read grant from you on the shared type or row. When the owner shares all rows of a type, a user whose role reads all entities (such astenant_adminorviewer) reads them too, without a grant. A token bound to a policy always needs the grant. See Shares & Grants.
#When the owner changes or withdraws
- If the owner changes the manifest, you get the change straight away. New resources are shared, and removed ones stop being readable. You don't need to accept again.
- If the owner withdraws the offer or deletes the manifest, everything it
shared stops. A shared workflow answers
404when you try to activate it, and your configuration of it becomes unreadable. Your stored configuration is kept, and works again if the owner offers the manifest again and you accept. - A job the definition binds, but that the owner borrowed from a third tenant, reaches you only through a manifest from that job's owner. See Job Bindings.
#Tear down
- App:
DELETE /apps/{specId}/configremoves your activation, along with its integrations, tokens and principal overlays. - Workflow: disable its triggers to stop intake
(
PUT /workflows/{id}/triggers/{triggerId}/disable). Your config stays for a later re-enable. - Decline offers you don't need
(
PUT /access/manifests/{manifestId}/acceptancewith"declined"), and remove any grants you added for shared resources.
#See also
- Share with Another Tenant: the owner's side.
- Shares & Grants: the access model.
- Config Schemas · Job Bindings
- Workflows · Apps · Secrets · Provisioning